【问题标题】:Mixing Razor Views and Web Forms Master Pages混合 Razor 视图和 Web 窗体母版页
【发布时间】:2011-11-16 11:49:53
【问题描述】:

我正在尝试按照 Scott Hanselman 的描述进行如下操作:

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

我有一个 Web 窗体用户控件,其背后的代码是从 Web 窗体和 Razor 母版页调用的,但在 Razor 布局中不起作用:

<div id="navtop">
    @{ Html.RenderPartial("~/Controls/MasterPageMenu.ascx"); }
</div>

用户控件包含以下内容:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MasterPageMenu.ascx.cs" Inherits="Controls.MasterPageMenu" %>

我得到错误: '~/Controls/MasterPageMenu.ascx' 中的视图必须派生自 ViewPage、ViewPage、ViewUserControl 或 ViewUserControl。

让这个在 Razor 视图世界中工作我错过了什么?

【问题讨论】:

    标签: asp.net-mvc-3 webforms razor master-pages


    【解决方案1】:

    这应该可行,只需确保您的部分派生自 ViewUserControl:

    <%@ Control 
        Language="C#" 
        Inherits="System.Web.Mvc.ViewUserControl" 
    %>
    

    请记住,即使使用 WebForms 视图引擎,也不建议在 ASP.NET MVC 中使用服务器端控件,甚至不应该尝试这样做。在 ASP.NET MVC 中,您有布局(如果您使用 WebForms 视图引擎,则为母版页)、视图和部分。就这样。用户控件属于经典的 WebForms,而不是 ASP.NET MVC。

    【讨论】:

    • 如果我执行上述操作,我将无法在动态创建菜单的用户控件中运行代码。我是否必须移动该代码才能在用户控件的 aspx 文件中运行?同意您的 cmets - 这是已经使用 WebForms 视图引擎构建的整个网站的桥梁解决方案。
    • @RSchmit,你为什么要谈论 ASP.NET MVC 应用程序中的代码?这样的事情已经不存在了。忘记他们。如果你有一些现有的代码,在等待迁移到 MVC 时保留它,保持这些 WebForms 的原样并逐步迁移它们。但绝对不要试图用这些东西污染 ASP.NET MVC 应用程序。这是注定要失败的。
    • 同意你的看法 - 这是一个 Brownfield 应用程序,我正在尝试使用 Razor 视图引擎进行新的增强。有很多污染!我仍然对 Scott Hanselman 建议的解决方案感到困惑,因为他说您可以从 Razor 布局中引用 WebForm 用户控件。这是用户控件没有代码的唯一情况吗?此用户控件背后的现有代码通过菜单服务器控件为网站动态创建菜单。我想我可以将后面的代码移到 aspx 文件中并在那里动态创建菜单?
    • @RSchmitt,哦不,你搞错了。通过用户控制,他的意思是部分。应该是用错词了。无论如何,这仅在您的 ascx 派生自 ViewUserControl 时才有效。而且您不应该将任何代码移到视图中。那会让事情变得更糟。在 ASP.NET MVC 中,您所称的 code behind 属于控制器和模型。
    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 2018-01-26
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多