【问题标题】:How to use Master Page from Web Forms in ASP.NET MVC Area如何在 ASP.NET MVC 区域中使用 Web 窗体中的母版页
【发布时间】:2015-06-28 18:12:13
【问题描述】:

我已将 MVC 区域添加到现有 Web 窗体项目。我想在 MVC 项目的所有视图中使用母版页。我不明白我应该如何引用 MVC 区域内 WebForms 的 MasterPage。

我看过这两篇文章:

http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx

http://www.eworldui.net/blog/post/2011/01/07/Using-Razor-Pages-with-WebForms-Master-Pages.aspx

我在控制器文件夹中添加了一个控制器扩展类。

public static class ControllerExtensions
{
    public static ViewResult RazorView(this Controller controller)
    {
        return RazorView(controller, null, null);
    }

    public static ViewResult RazorView(this Controller controller, object model)
    {
        return RazorView(controller, null, model);
    }

    public static ViewResult RazorView(this Controller controller, string viewName)
    {
        return RazorView(controller, viewName, null);
    }

    public static ViewResult RazorView(this Controller controller, string viewName, object model)
    {
        if (model != null) controller.ViewData.Model = model;

        controller.ViewBag._ViewName = GetViewName(controller, viewName);

        return new ViewResult
        {
            ViewName = "RazorView",
            ViewData = controller.ViewData,
            TempData = controller.TempData
        };
    }

    static string GetViewName(Controller controller, string viewName)
    {
        return !string.IsNullOrEmpty(viewName)
            ? viewName
            : controller.RouteData.GetRequiredString("action");
    }
}

/Views/Shared 文件夹中我添加了三个文件:

_SiteLayout.cshtml

@RenderBody()

RazorView.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/MyApp/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% Html.RenderPartial((string) ViewBag._ViewName); %>
</asp:Content>

Site.Master

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="TitleContent" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <div>
        <asp:ContentPlaceHolder ID="MainContent" runat="server" />
    </div>
</body>
</html>

ViewsShared文件夹的web.Config里面我加了:

<system.web>
    <pages pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
      <namespaces>
        <add namespace="System.Web.Mvc.Html"/>
      </namespaces>
    </pages>
  </system.web>

在我的控制器中,它正确返回 MVC 视图,但 MasterPage 中的内容没有出现。如何引用 Web 表单的母版页?

【问题讨论】:

标签: c# asp.net-mvc razor


【解决方案1】:

简而言之,你不能。 Asp.net webforms 控件需要视图状态并使用不同的“引擎”进行解析。仅仅因为它们既是 Microsoft 又是 .Net 并不一定意味着它们是兼容的。但这并不意味着将它们一起运行是不可能的。

您总是可以使用一个标准的 .aspx 页面来引用您的母版页,并且里面有一个 ajax 驱动的内容区域。可以使用 MVC 控制器返回的 ActionResults 刷新此内容区域。因此,虽然看起来您将访问 mysite.com/default.aspx,但内容实际上来自 mysite.com/Home/Index(或您保留默认“主页”的任何地方)。尽管如此,它们仍然是完全独立的实体,任何一个对另一个控件的操作都可能导致 masterr 中的无效视图状态或 AntiForgeryToken 失败。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2016-10-28
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多