Правильный способ использования _viewstart.cshtml и частичных видов Razor?


156

Я использую _viewstart.cshtml для автоматического назначения того же макета Razor моим представлениям.

Это простой файл в корне моей папки Views, который выглядит так:

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

Это более СУХОЙ, чем добавление директивы @Layout для каждого вида.

Тем не менее, это создает проблему для Razor частично представлений , поскольку они запускают содержимое _viewstart.cshtml и, следовательно, неправильно присваивают себе макет, что делает их больше не частичными.

Вот гипотетический проект, показывающий файл _viewstart.cshtml, общий файл _layout.shtml и частичное представление («AnonBar.cshtml»).

Пример структуры проекта

В настоящее время я могу обойти это путем добавления следующей строки в каждое частичное представление:

@{
    Layout = "";
}

Это кажется неправильным способом обозначить представление как частичное в Razor. (Обратите внимание, что в отличие от механизма просмотра веб-форм, расширение файла одинаково для частичных представлений.)

Другие варианты я рассмотрел, но это еще хуже:

  • Поместить все частичные представления в общую папку, чтобы они могли совместно использовать общий _viewstart.cshtml. Это нарушает соглашение о представлениях, находящихся в той же папке, что и их контроллер.
  • Не используя частичные представления.

Это то, что все еще дорабатывается командой разработчиков движка Razor, или я упускаю фундаментальную концепцию?


3
Извините за оффтоп, но что это за иконки рядом с именами файлов? :) Какой-то контроль версий, верно?
— Alex

6
@jitbit: VisualSVN
— erict

Ответы:


237

Если вы return PartialView()из ваших контролеров (а не return View()), то _viewstart.cshtmlне будете казнены.


6
Ага, не знал про PartialViewResultкласс. Это было то, что мне было нужно.
— Портман

6
В качестве продолжения я обнаружил, что мне нужно также явно установить тип возвращаемого значения метода действия PartialViewResultвместо обычного ActionResult.
— Портман

2
@ Портман, вы видите проблемы, когда тип возвращаемого значения метода действия отсутствует ActionResult? Я удивлен, что это проблема, потому что среда выполнения MVC не должна вести себя по-другому в этом случае (то есть, пока тип, возвращаемый методом действия, ActionResultили любой класс, производный от него, вещи должны просто работать).
— Марсинд

@marcind Я получаю переполнение стека на w3wp.exe, если установить тип возвращаемого значения ActionResult. Работает нормально, если тип возвращаемого значения PartialViewResult. Думаешь, мне нужно отправить сообщение об ошибке подключения?
— Портман

Для меня это звучит как один - кричите, если вы отправите сообщение об ошибке подключения, проголосуете.
— Дав
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.