问题 如何将.aspx页面添加到现有的MVC 4项目中?


我有ASP.NET MVC 4项目。我想添加到这个MVC项目2 .aspx 另一个WebForms项目的页面。我有几个问题:

  1. 我应该在哪里复制这个 .aspx 文件,我应该怎么做 配置 我的 路线?
  2. 我该怎么说呢 .aspx 要使用的页面 ~/Shared/_Layout.chtml 作为一个 母版页?
  3. 另外这个 .aspx页面 使用 .ascx控制。我应该在哪里存放它们?
  4. 我应该如何修改 web.config文件?

我看过了 链接 张贴在 这个 问题,但他们似乎已经过时了。很多链接解释了如何将MVC添加到WebForms,但我一直在寻找。

任何有用的链接将不胜感激。谢谢!


11758
2017-08-19 14:05


起源

斯科特汉塞尔曼的帖子 hanselman.com/blog/... 如果将WebForm应用程序集成到MVC中,或者反之亦然,步骤是相同的​​,那么它仍然有效。使用.aspx页面的Razor模板作为母版页不起作用,由于使用了不同的视图引擎,因此无法将它们组合在一起。 - Andreas
@Andreas感谢您的评论。因此,如果无法将它们组合起来,是否可以采用其他方法来实现? - Shukhrat Raimov
最简单的方法是使用ASP.NET WebFormViewEngine(.aspx)母版页和Razor模板基本布局(.chtml) - Andreas


答案:


解决方案:

事实证明,添加 的.aspx 页面到现有的 MVC 项目比将.mvc添加到.aspx更容易完成。对我来说最有趣的事情是在一个项目的范围内找出webforms和MVC  IIS上的运行时。

所以我做了什么:

  1. 添加 的.aspx 从另一个项目到的页面  我的 MVC 项目
  2. 创造了新的 母版页 为了我的 web表单 页面(右键单击项目 - >添加 - >新项目 - >母版页)
  3. 为了要做 主页 WF和 _Layout.chtml MVC的共享相同 掌握'观察' 我发现 这篇好文章 这允许你调用类似的东西 @ Html.RenderPartial() 内部方法 .aspx页面
  4. 以下代码提供了如何实现的信息 的RenderPartial WebForms中的方法:

    public class WebFormController : Controller { }
    
    public static class WebFormMVCUtil
    {
    
        public static void RenderPartial( string partialName, object model )
        {
            //get a wrapper for the legacy WebForm context
            var httpCtx = new HttpContextWrapper( System.Web.HttpContext.Current );
    
            //create a mock route that points to the empty controller
            var rt = new RouteData();
            rt.Values.Add( "controller", "WebFormController" );
    
            //create a controller context for the route and http context
            var ctx = new ControllerContext( 
            new RequestContext( httpCtx, rt ), new WebFormController() );
    
            //find the partial view using the viewengine
            var view = ViewEngines.Engines.FindPartialView( ctx, partialName ).View;
    
            //create a view context and assign the model
            var vctx = new ViewContext( ctx, view, 
                new ViewDataDictionary { Model = model }, 
                new TempDataDictionary() );
    
            //render the partial view
            view.Render( vctx, System.Web.HttpContext.Current.Response.Output );
        }
    
    }
    

    将它添加到.aspx页面的codebehind.cs。然后你可以从webforms中调用它,如下所示:

    <% WebFormMVCUtil.RenderPartial( "ViewName", this.GetModel() ); %>
    
  5. 由于我只在所有页面中共享了“菜单”,因此我将其添加到部分视图中,然后将其调用 _Layout.chtml 

    @Html.Partial("_Menu")
    

并在 MasterPage.Master 喜欢这个:

    <% WebFormMVCUtil.RenderPartial("_Menu", null ); %>

这就是它的全部。结果我的 _Layout.chtml 和 MasterPage.Master 使用相同的共享部分视图。我可以接受 的.aspx 页面只需浏览它们即可。如果路由系统存在一些问题,可以添加 routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 到App_Start中的routeConfig。

我使用的来源:

  1. 将asp net mvc与webforms结合使用 
  2. 混合Web窗体和ASP.NET MVC 
  3. MixingRazorViewsAndWebFormsMasterPages
  4. 如何在webform中包含局部视图

我希望以后能帮到别人。


16
2017-08-25 08:59



我在网络表单的调用中遇到了GetModel()。我看到的错误是“z.aspx不包含'GetModel'的定义,并且找不到接受类型'z_aspx'的第一个参数的扩展方法(你是否缺少using指令或汇编引用?)我可以'找到定义GetModel的位置。 - Echo Train