Vermutlich besteht der Hauptanwendungsfall hierfür darin, ein Basismodell für alle (oder die meisten) Controller-Aktionen in die Ansicht zu bringen.
Angesichts dessen habe ich eine Kombination aus mehreren dieser Antworten verwendet, wobei ich mich hauptsächlich auf Colin Bacons Antwort stützte.
Es ist richtig, dass dies immer noch Controller-Logik ist, da wir ein Ansichtsmodell füllen, um zu einer Ansicht zurückzukehren. Daher ist der richtige Ort, um dies zu platzieren, in der Steuerung.
Wir möchten, dass dies auf allen Controllern geschieht, da wir dies für die Layoutseite verwenden. Ich verwende es für Teilansichten, die auf der Layoutseite gerendert werden.
Wir möchten auch weiterhin den zusätzlichen Vorteil eines stark typisierten ViewModel
Daher habe ich ein BaseViewModel und einen BaseController erstellt. Alle ViewModels-Controller erben von BaseViewModel bzw. BaseController.
Der Code:
BaseController
public class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var model = filterContext.Controller.ViewData.Model as BaseViewModel;
model.AwesomeModelProperty = "Awesome Property Value";
model.FooterModel = this.getFooterModel();
}
protected FooterModel getFooterModel()
{
FooterModel model = new FooterModel();
model.FooterModelProperty = "OMG Becky!!! Another Awesome Property!";
}
}
Beachten Sie die Verwendung von OnActionExecuted aus diesem SO-Beitrag
HomeController
public class HomeController : BaseController
{
public ActionResult Index(string id)
{
HomeIndexModel model = new HomeIndexModel();
// populate HomeIndexModel ...
return View(model);
}
}
BaseViewModel
public class BaseViewModel
{
public string AwesomeModelProperty { get; set; }
public FooterModel FooterModel { get; set; }
}
HomeViewModel
public class HomeIndexModel : BaseViewModel
{
public string FirstName { get; set; }
// other awesome properties
}
FooterModel
public class FooterModel
{
public string FooterModelProperty { get; set; }
}
Layout.cshtml
@model WebSite.Models.BaseViewModel
<!DOCTYPE html>
<html>
<head>
< ... meta tags and styles and whatnot ... >
</head>
<body>
<header>
@{ Html.RenderPartial("_Nav", Model.FooterModel.FooterModelProperty);}
</header>
<main>
<div class="container">
@RenderBody()
</div>
@{ Html.RenderPartial("_AnotherPartial", Model); }
@{ Html.RenderPartial("_Contact"); }
</main>
<footer>
@{ Html.RenderPartial("_Footer", Model.FooterModel); }
</footer>
< ... render scripts ... >
@RenderSection("scripts", required: false)
</body>
</html>
_Nav.cshtml
@model string
<nav>
<ul>
<li>
<a href="@Model" target="_blank">Mind Blown!</a>
</li>
</ul>
</nav>
Hoffentlich hilft das.