2011-01-17 2 views
4

Использование ASP.NET MVC3 Я создал новое представление Razor и дал ему то же имя, что и существующее .aspx-представление, которое я использовал. Я заметил, что контроллер продолжал поднимать вид .aspx (который имеет то же имя, что и действие), что в значительной степени соответствует ожидаемому. Затем я переименовал представление .aspx и действие, получившее вид бритвы .cshtml.Как ASP.NET MVC арбитраж между двумя одинаково названными представлениями (aspx и бритва)?

Так что, если у меня есть два вида, называемых myview.aspx и myview.cshtml, и действие под названием MyView(), которое возвращает return View(), оно отобразит представление myview.aspx и вернет его.

Как MVC3 решил, какой тип представления по умолчанию? Есть ли способ изменить это поведение по умолчанию, чтобы предпочесть вид бритвы над .aspx-представлением?

ответ

4

Все стебли вниз к порядку зрения двигателей в ViewEngines.Engines коллекции. Вот как ViewEngines статический конструктор выглядит (как видно с отражателем в ASP.NET MVC 3 RTM):

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

, который объясняет, почему WebForms является предпочтительным вид двигателя.

Таким образом, вы могли бы выполнить следующую гротескный хак в Application_Start, чтобы инвертировать предпочтение по отношению к бритве :-)

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

Я бы предположил, что он находится в порядке, в котором зарегистрированы двигатели просмотра. Вначале будут запрошены ранее зарегистрированные двигатели просмотра. Если вы хотите изменить порядок:

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