Có lẽ, trường hợp sử dụng chính cho điều này là để đưa một mô hình cơ sở vào dạng xem cho tất cả (hoặc phần lớn) các hành động của bộ điều khiển.
Do đó, tôi đã sử dụng kết hợp một vài trong số những câu trả lời này, ủng hộ chính cho câu trả lời của Colin Bacon.
Đúng là đây vẫn là bộ điều khiển logic bởi vì chúng tôi đang đưa ra một chế độ xem để quay lại chế độ xem. Do đó, vị trí chính xác để đặt cái này là trong bộ điều khiển.
Chúng tôi muốn điều này xảy ra trên tất cả các bộ điều khiển vì chúng tôi sử dụng điều này cho trang bố cục. Tôi đang sử dụng nó cho các chế độ xem một phần được hiển thị trong trang bố cục.
Chúng tôi cũng vẫn muốn lợi ích gia tăng của một ViewModel được gõ mạnh
Vì vậy, tôi đã tạo một BaseViewModel và BaseContoder. Tất cả các Bộ điều khiển ViewModels sẽ kế thừa từ BaseViewModel và BaseContoder tương ứng.
Mật mã:
Trình điều khiển cơ sở
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!";
}
}
Lưu ý việc sử dụng OnActionExecuted như được lấy từ bài SO này
HomeContoder
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; }
}
Giao diện.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>
Hy vọng điều này sẽ giúp.