Przypuszczalnie podstawowym przypadkiem użycia tego jest pobranie modelu podstawowego do widoku dla wszystkich (lub większości) akcji kontrolera.
Biorąc to pod uwagę, użyłem kombinacji kilku z tych odpowiedzi, głównie w oparciu o odpowiedź Colina Bacona.
To prawda, że nadal jest to logika kontrolera, ponieważ zapełniamy model widoku, aby powrócić do widoku. Dlatego właściwym miejscem do umieszczenia tego jest kontroler.
Chcemy, aby miało to miejsce na wszystkich kontrolerach, ponieważ używamy tego na stronie układu. Używam go do częściowych widoków renderowanych na stronie układu.
Nadal chcemy również dodatkowej korzyści z silnie wpisanego ViewModel
W ten sposób utworzyłem BaseViewModel i BaseController. Wszystkie kontrolery ViewModels będą dziedziczyć odpowiednio po BaseViewModel i BaseController.
Kod:
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!";
}
}
Zwróć uwagę na użycie OnActionExecuted wzięte z tego postu SO
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>
Mam nadzieję, że to pomoże.