ASP.NET MVC如何在两个具有相同名称的视图(aspx和razor)之间进行仲裁?

时间:2011-01-17 21:31:25

标签: asp.net-mvc-3 razor

使用ASP.NET MVC3我创建了一个新的Razor视图,并为它提供了与我一直使用的现有.aspx视图相同的名称。我注意到控制器继续拿起.aspx视图(与动作同名),这正是我的预期。然后我重命名了.aspx视图并且操作选择了剃刀.cshtml视图。

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

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

2 个答案:

答案 0 :(得分:4)

所有内容都归结为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执行以下奇怪的黑客攻击来反转对Razor的偏好: - )

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

答案 1 :(得分:1)

我认为它可以归结为视图引擎的注册顺序。将首先查询先前注册的视图引擎。如果您想更改订单:

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