Правильный способ использования _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не будете казнены.

marcind
источник
6
Ага, не знал про PartialViewResultкласс. Это было то, что мне было нужно.
Портман
6
В качестве продолжения я обнаружил, что мне нужно также явно установить тип возвращаемого значения метода действия PartialViewResultвместо обычного ActionResult.
Портман
2
@ Портман, вы видите проблемы, когда тип возвращаемого значения метода действия отсутствует ActionResult? Я удивлен, что это проблема, потому что среда выполнения MVC не должна вести себя по-другому в этом случае (то есть, пока тип, возвращаемый методом действия, ActionResultили любой класс, производный от него, вещи должны просто работать).
Марсинд
@marcind Я получаю переполнение стека на w3wp.exe, если установить тип возвращаемого значения ActionResult. Работает нормально, если тип возвращаемого значения PartialViewResult. Думаешь, мне нужно отправить сообщение об ошибке подключения?
Портман
Для меня это звучит как один - кричите, если вы отправите сообщение об ошибке подключения, проголосуете.
Дав