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


156

Я використовую _viewstart.cshtml, щоб автоматично призначити той же макет бритви моїм уявленням.

Це просто мертвий простий файл у корені моєї папки Views, який виглядає приблизно так:

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

Це більше ДУХО, ніж додавання директиви @Layout до кожного перегляду.

Однак це створює проблему для часткових представлень Razor , оскільки вони виконують вміст _viewstart.cshtml і тому неправильно призначають собі макет, що робить їх, гм, більше не частковими.

Ось гіпотетичний проект, який показує файл _viewstart.cshtml, спільний файл _layout.shtml та частковий вигляд ("AnonBar.cshtml").

Приклад структури проекту

В даний час спосіб подолати це шляхом додавання наступного рядка до кожного часткового перегляду:

@{
    Layout = "";
}

Це здається невірним способом позначити погляд як частковий у Razor. (Зауважте, що на відміну від механізму перегляду веб-форм, розширення файлу однакове для часткових переглядів.)

Інші варіанти, які я розглядав, але які ще гірші:

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

Це щось, що все ще розробляється колективом двигуна перегляду Razor, чи я пропускаю фундаментальну концепцію?


3
Вибачте за офтопік, але які ці значки поруч із назвами файлів? :) Якесь джерело управління правдою?
Олексій

6
@jitbit: VisualSVN
обмежитися

Відповіді:


237

Якщо ви return PartialView()з ваших контролерів (замість return View()), то _viewstart.cshtmlвони не будуть виконані.


6
Ага, про PartialViewResultклас не знали . Це було те, що мені було потрібно.
Портман

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

2
@Portman Ви бачите проблеми, коли тип повернення методу дії не є ActionResult? Я здивований, що це проблема, тому що час виконання MVC не повинен вести себе по-різному (тобто до тих пір, поки тип, що повертається методом дії, ActionResultабо будь-який клас, похідний з нього, повинен просто працювати).
marcind

@marcind я отримую переповнення стека на w3wp.exe, якщо я встановив тип повернення ActionResult. Працює чудово, якщо тип повернення є PartialViewResult. Думаєте, мені потрібно подати помилку Connect?
Портман

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