Где и как связан файл макета _ViewStart.cshtml? - PullRequest
186 голосов
/ 15 февраля 2012

Вот файл About.cshtml из шаблона MVC 3 по умолчанию:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

Я ожидаю, что ссылка на файл _ViewStart будет найдена в About.cshtml, но, очевидно, это не так.

Я смотрел в global.asax и web.config, но не могу выяснить, как файл About.cshtml "связан" с макетом из файла _ViewStart.

Все работает как положено, я просто хотел бы знать, что происходит под капотом ...

Ответы [ 8 ]

224 голосов
/ 16 февраля 2012

Из блога ScottGu :

Начиная с версии бета-версии ASP.NET MVC 3, теперь вы можете добавить файл с именем _ViewStart.cshtml (или _ViewStart.vbhtml для VB).) в папке \ Views вашего проекта:

Файл _ViewStart можно использовать для определения общего кода представления, который вы хотите выполнить в начале рендеринга каждого представления.Например, мы могли бы написать код в нашем файле _ViewStart.cshtml, чтобы программно установить свойство Layout для каждого представления в качестве файла SiteLayout.cshtml по умолчанию:

Поскольку этот код выполняется в начале каждого представления, мыбольше не нужно явно устанавливать макет в любом из наших отдельных файлов представлений (кроме случаев, когда мы хотим переопределить значение по умолчанию, указанное выше).

Важно: поскольку _ViewStart.cshtml позволяет нам писать код, мы можем при желаниисделать нашу логику выбора Layout более богатой, чем просто базовый набор свойств.Например: мы могли бы изменить шаблон макета, который мы используем, в зависимости от того, какой тип устройства обращается к сайту - и иметь оптимизированный макет телефона или планшета для этих устройств, а также макет, оптимизированный для настольных компьютеров, для ПК / ноутбуков.Или, если бы мы создавали систему CMS или общее общее приложение, которое используется несколькими клиентами, мы могли бы выбирать различные макеты для использования в зависимости от клиента (или его роли) при доступе к сайту.

Это позволяет многоГибкость пользовательского интерфейса.Это также позволяет упростить однократную запись логики представления и избежать ее повторения в нескольких местах.

Также см. this .

33 голосов
/ 16 сентября 2013

В более общем смысле эта способность инфраструктуры MVC «знать» о _Viewstart.cshtml называется «Кодирование по соглашению».

Соглашение о конфигурации (также известнокак кодирование по соглашению) - это парадигма разработки программного обеспечения, которая стремится уменьшить количество решений, которые должны принять разработчики, получая простоту, но не обязательно теряя гибкость.Фраза по сути означает, что разработчику нужно только указать нетрадиционные аспекты приложения.Например, если в модели есть класс Sale, соответствующая таблица в базе данных по умолчанию называется sales.Только если кто-то отклоняется от этого соглашения, например, называет таблицу «products_sold», нужно написать код для этих имен.

Википедия

В этом нет ничего волшебного,Он только что был записан в базовую кодовую базу инфраструктуры MVC и поэтому является тем, о чем MVC «знает».Вот почему вы не найдете его в файлах .config или где-либо еще;это на самом деле в коде MVC.Однако вы можете переопределить, чтобы изменить или обнулить эти соглашения.

21 голосов
/ 24 июня 2013

Просто еще одна мысль.

Если вы хотите иметь свой собственный cshtml файл в качестве общего шаблона, вы можете сделать это следующим образом

В вашем _viewstart.cshtml вы можете упомянуть ваш общий cshtml файл.

@{Layout = "~/Views/Shared/_Layout.cshtml";}
12 голосов
/ 14 апреля 2015

Исходный код является гораздо лучшим местом для поиска, чем документация.

Ссылаясь на код MVC 6 от Github, у нас есть несколько интересных файлов

---- ---- обновление

Из-за изменений в структуре источника информацию о том, как собираются страницы просмотра, теперь можно найти в RazorViewEngine.cs . Ищите функцию «GetViewStartPages».

---- / обновление ----

Чтобы ответить, как они вступают в игру, посмотрите на RazorView , который, как я считаю (из-за IView), связан с конвейером MVC. Этот файл имеет метод RenderAsync, который вызывается из конвейера MVC для визуализации запрошенного представления.

RenderAsync выполняет вызовы RenderPage И ТОГО RenderLayout (ЗАМЕТЬТЕ ЗАКАЗ). Сначала RenderPage выполняет вызовы для работы с файлами viewstart (обратите внимание, что во множественном числе может быть более одного файла _viewstart).

Таким образом, запрашиваемую информацию можно получить из функции RenderViewStartAsync в файле RazorView.cs в пространстве имен Microsoft.AspNet.Mvc.Razor.

6 голосов
/ 20 января 2016

Это может добавить некоторую дополнительную информацию к этому вопросу сейчас (2016 ala MVC4, MVC5).

Механизм Razor находит и запускает код в _ViewStart.cshtml перед любым другим кодом, который находится в том же каталоге или подкаталоге, где находится _ViewStart.cshtml .

Любое представление может переопределить свойство Layout или любое из его значений.

Просто подумал, что мог бы добавить немного больше информации, чтобы показать вам, почему это _ViewStart.

Если вы получите ILSpy и изучите код в RazorViewEngine (System.Web.Mvc.dll), вы увидите, что сам код ссылается на это имя.

_ViewStart in  System.Web.Mvc.dll

Вы можете видеть, что RazorViewEngine ищет файл с таким именем:

razorviewengine code

RazorViewEngine.ViewStartFileName = "_ViewStart";
1 голос
/ 07 февраля 2017

Если вы хотите иметь общий макет для ваших страниц, вам нужно определить общий макет и связать вид с макетом. Мы должны установить свойство макета для каждого вида, это нарушает СУХОЙ ) принцип. Для этого .Net Framework предоставляет файл "_ViewStart.cshtml", расположенный внутри папки просмотра. Мы размещаем информацию о макете в файле "_ViewStart.cshtml", и каждое представление по умолчанию использует эту информацию о макете. Если вы хотите предоставить какую-то другую информацию о макете, допустим, для вашего домашнего просмотра вы можете создать новый "_ViewStart.cshtml" со ссылкой на этот макет и поместить его в папку "Home View".

0 голосов
/ 14 января 2019

Краткий ответ: : ViewStarts запускаются первыми, когда визуализируется любое представление.Длинная история ниже:

История создания одного файла представления:

  1. ViewStart объединяется с ViewImports и затем выполняется как одинфайл.Обратите внимание, что ViewImports всегда объединяется с любым файлом cshtml, включая файл ViewStart.Его цель - абстрагировать операторы @using и другие общие директивы.
  2. Вывод ViewStart (например, Layout и ViewData) становится доступным для конкретного файла View.
  3. Внутри файла View, если переменная Layout равна / становится пустой, тело представления отображается и окончательный результат доставляется пользователю.
  4. Если переменная Layout равна / становится ненулевой, выполнение перемещается в файл макета, который, в свою очередь, объединяется с ViewImports в виде одного файла, а затем в операторе @RenderBody () внутри файла макета выполняетсявернулся к файлу представления, который снова сливается с ViewImports, а выходные данные объединяются с файлом макета в расположении @RenderBody (), и окончательный вывод наконец доставляется пользователю.

Надеждыэто заставляет вас осознать, что на самом деле происходит внутри неизвестных загадок жизненного цикла вашей программы.

0 голосов
/ 17 ноября 2018

У меня тоже была такая же проблема, и позже я заметил, что app.UseStaticFiles(); отсутствует в трубопроводе.

Работает после добавления в конвейер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...