【问题标题】:How does ASP.NET MVC arbitrate between two identically named views (aspx and razor)?ASP.NET MVC 如何在两个同名视图(aspx 和 razor)之间进行仲裁?
【发布时间】:2011-01-17 21:31:24
【问题描述】:

使用 ASP.NET MVC3,我创建了一个新的 Razor 视图,并将其命名为与我一直使用的现有 .aspx 视图相同的名称。我注意到控制器继续获取 .aspx 视图(与操作同名),这几乎是我所期望的。然后我重命名了 .aspx 视图,并且动作拾取了 razor .cshtml 视图。

因此,如果我有两个名为 myview.aspx 和 myview.cshtml 的视图以及一个名为 MyView() 的操作,它执行返回 View(),它将获取 myview.aspx 视图并返回它。

MVC3 如何决定默认的视图类型? 有没有办法更改此默认行为,以更喜欢剃刀视图而不是 .aspx 视图?

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    一切都源于ViewEngines.Engines 集合中的视图引擎的顺序。以下是ViewEngines 静态构造函数的样子(如 ASP.NET MVC 3 RTM 中的 Reflector 所示):

    static ViewEngines()
    {
        ViewEngineCollection engines = new ViewEngineCollection();
        engines.Add(new WebFormViewEngine());
        engines.Add(new RazorViewEngine());
        _engines = engines;
    }
    

    这解释了为什么 WebForms 是首选的视图引擎。

    因此,您可以在 Application_Start 中执行以下怪诞的 hack,以反转对 Razor 的偏好:-)

    var aspxVe = ViewEngines.Engines[0];
    var razorVe = ViewEngines.Engines[1];
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(razorVe);
    ViewEngines.Engines.Add(aspxVe);
    

    【讨论】:

      【解决方案2】:

      我想这取决于视图引擎的注册顺序。较早注册的视图引擎将首先被查询。如果要更改顺序:

      ViewEngines.Engines.Insert(0, ...);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        相关资源
        最近更新 更多