Нет, вам абсолютно не обязательно определять это в каждой ViewModel. Обычно в _Layout View сохраняются постоянные элементы макета, определенные следующим образом:
@using YourModelsNS
@* layout markup omitted for brevity *@
<div id="header">
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial", new YourMode() { SomeString = "Test" })
</div>
<div id="menucontainer">
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Test", "Test", "Test")</li>
</ul>
</div>
</div>
<div id="main">
@RenderBody()
</div>
<div id="footer">
</div>
</div>
Обратите внимание, что в представлении вы видите @Html.Partial("_LogOnPartial")
. Это то, что затем отображает конкретный вид, _LogOnPartial.cshtml. Который содержит эту разметку:
@model YourModelNS.YourModel
@if(Request.IsAuthenticated) {
<text>Welcome <strong>@User.Identity.Name</strong>!
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
@:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}
@Model.SomeString
Это отдельно от страниц контента, которые отображаются с помощью @RenderBody (), поэтому вам не нужно будет включать отдельные задачи во все ViewModels или сами представления.
РЕДАКТИРОВАТЬ : Код был отредактирован для передачи объекта модели в частичное представление. Теперь каждая страница контента (по RenderBody()
не знает модель YourModel
), и соответствующие им ViewModels не должны ничего знать об этом.
Отказ от ответственности: я не рекомендую вышеупомянутую практику кода, упущение логики контроллера заключается просто в сосредоточении внимания на рассматриваемом вопросе.