Agaknya, kasus penggunaan utama untuk ini adalah mendapatkan model dasar ke tampilan untuk semua (atau sebagian besar) tindakan pengontrol.
Mengingat itu, saya telah menggunakan kombinasi dari beberapa jawaban ini, dukungan piggy utama pada jawaban Colin Bacon.
Benar bahwa ini masih logika pengontrol karena kita sedang mengisi model tampilan untuk kembali ke tampilan. Jadi tempat yang tepat untuk meletakkan ini adalah di pengontrol.
Kami ingin ini terjadi pada semua pengontrol karena kami menggunakan ini untuk halaman tata letak. Saya menggunakannya untuk tampilan parsial yang dirender di halaman tata letak.
Kami juga masih menginginkan manfaat tambahan dari ViewModel yang diketik dengan kuat
Jadi, saya telah membuat BaseViewModel dan BaseController. Semua Pengontrol ViewModels masing-masing akan mewarisi dari BaseViewModel dan BaseController.
Kode:
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!";
}
}
Perhatikan penggunaan OnActionExecuted seperti yang diambil dari posting SO ini
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>
Semoga ini membantu.