2014-02-19 5 views
5

Я играю с механизмом просмотра бритвы, и есть кое-что, что я не совсем понимаю.Почему полный путь к макету требуется в файле viewstart, когда местоположения указаны в движке просмотра?

_ViewStart файл определяет макет с полным путем к файлу, как это:

@{ 
    Layout = "~/Views/Shared/_MasterLayout.cshtml"; 
} 

Как я понимаю, должны быть включены полный путь и расширение. Вы не просто сделать это:

@{ 
    Layout = "_MasterLayout"; 
} 

Однако вид двигателя определяет места для поиска основных видов:

 MasterLocationFormats = new string[] { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/Shared/{0}.cshtml" 
     }; 

Каким полный путь к файлу мастер-макета является требуется в файле _ViewStart?

И если указан полный путь, то в чем же смысл указывать возможные местоположения в MasterLocationFormats[]?

Update

Ну я до сих пор не нашли удовлетворительного ответа на этот вопрос.

экспериментирования, казалось бы, что MasterLocationFormats либо ingored или переопределены при указании макета в файле viewstart.

Я смог полностью удалить местоположение MasterLayout.cshtml из MasterLocationFormats, и это не имело никакого значения для отображения веб-страниц.

Мой личный вопрос был вызван использованием MvcMailer package, что позволяет указать вид бритвы для использования в качестве шаблона для отправки html-адреса электронной почты. Это использует MasterLocationFormats.

Так что я все еще немного озадачен, но надеюсь, что это будет использовать кому угодно. Также this post may also be of help.

ответ

3

В реализации CreateView RazorViewEngine создан новый RazorView.

И когда RazorView переопределяет метод RenderView BuildManagerCompiledView, который делает фактический вызов метода Render метода IView.

И в конце этой реализации эта линия называется.

webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage); 

И это приводит нас к методу ExecutePageHierarchy из WebViewPage, который находится в System.Web.Mvc.dll.

public override void ExecutePageHierarchy() 
{ 
    TextWriter writer = this.ViewContext.Writer; 
    this.ViewContext.Writer = this.Output; 
    base.ExecutePageHierarchy(); 
    if (!string.IsNullOrEmpty(this.OverridenLayoutPath)) 
     this.Layout = this.OverridenLayoutPath; 
    this.ViewContext.Writer = writer; 
} 

Как вы можете видеть выше Дорожка макета переопределена.

Для получения дополнительной информации вы можете проверить классы RazorView и WebViewPage.

+0

Я никогда не ожидал ответа после всего этого времени. Хороший! –