【问题标题】:How to add .aspx pages to existing MVC 4 project?如何将 .aspx 页面添加到现有的 MVC 4 项目?
【发布时间】:2014-10-12 16:17:01
【问题描述】:

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

  1. 我应该在哪里复制这个 .aspx 文件以及我应该如何配置我的 路线?
  2. 我应该如何告诉.aspx 页面使用~/Shared/_Layout.chtml 作为主页面?
  3. 此外,此 .aspx 页面 使用 .ascx 控件。我应该把它们存放在哪里?
  4. 我应该如何修改web.config 文件?

我查看了this 问题中发布的links,但它们似乎已经过时了。很多链接都解释了如何将 MVC 添加到 WebForms,但我一直在寻找。

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

【问题讨论】:

  • Scott Hanselman hanselman.com/blog/… 的帖子仍然有效,无论您是否将 WebForm 应用程序集成到 MVC 中或反之亦然,步骤都是相同的。将 .aspx 页面的 Razor 模板用作母版页不起作用,由于使用的视图引擎不同,因此无法组合它们。
  • @Andreas 感谢您的评论。那么如果无法将它们结合起来,是否可以用另一种方法来做到这一点?
  • 最简单的方法是拥有一个 ASP.NET WebFormViewEngine (.aspx) 母版页和一个 Razor 模板基础布局 (.chtml)

标签: asp.net asp.net-mvc asp.net-mvc-4 razor webforms


【解决方案1】:

解决办法:

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

所以我做了什么:

  1. 将另一个项目中的 .aspx 页面添加到我的 MVC 项目的 root
  2. 为我的网络表单页面创建了新的母版页(右键单击项目->添加->新项目->母版页)
  3. 为了使 WF 的 Master Page 和 MVC 的 _Layout.chtml 共享相同的 Master 'View' 我找到了this great article允许您在 .aspx 页面 中调用类似于 @Html.RenderPartial() 方法的内容
  4. 以下代码提供了如何在 WebForms 中实现 RenderPartial 方法的信息:

    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 中。然后你可以像这样从网络表单中调用它:

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

    @Html.Partial("_Menu")
    

MasterPage.Master 中像这样:

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

这就是它的全部内容。因此,我的 _Layout.chtmlMasterPage.Master 使用相同的共享局部视图。我可以通过导航访问 .aspx 页面。如果您对路由系统有一些问题,可以在 App_Start 中将 routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 添加到您的 routeConfig 中。

我使用的来源:

  1. Combine asp net mvc with webforms
  2. Mixing Web Forms and ASP.NET MVC
  3. MixingRazorViewsAndWebFormsMasterPages
  4. How to include a partial view inside a webform

希望以后能对大家有所帮助。

【讨论】:

  • 我在来自网络表单的调用中被困在 GetModel() 上。我看到的错误是“z.aspx 不包含'GetModel'的定义,并且找不到接受'z_aspx'类型的第一个参数的扩展方法(您是否缺少 using 指令或程序集引用?)我可以” t 找到 GetModel 的定义位置。
猜你喜欢
  • 2019-02-05
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多