สันนิษฐานว่ากรณีการใช้งานหลักสำหรับสิ่งนี้คือการรับแบบจำลองพื้นฐานไปยังมุมมองสำหรับการกระทำของคอนโทรลเลอร์ทั้งหมด (หรือส่วนใหญ่)
ด้วยเหตุนี้ฉันจึงใช้คำตอบหลาย ๆ ข้อรวมกันการสนับสนุนลูกหมูหลักกับคำตอบของ Colin Bacon
ถูกต้องที่นี่ยังคงเป็นตรรกะของคอนโทรลเลอร์เนื่องจากเรากำลังเติม viewmodel เพื่อกลับไปที่มุมมอง ดังนั้นตำแหน่งที่ถูกต้องในการวางสิ่งนี้คือในคอนโทรลเลอร์
เราต้องการให้สิ่งนี้เกิดขึ้นกับตัวควบคุมทั้งหมดเพราะเราใช้สิ่งนี้สำหรับหน้าเค้าโครง ฉันใช้มันสำหรับมุมมองบางส่วนที่แสดงในหน้าเค้าโครง
เรายังต้องการประโยชน์เพิ่มเติมของ ViewModel ที่พิมพ์ผิด
ดังนั้นฉันจึงสร้าง BaseViewModel และ BaseController ViewModels Controllers ทั้งหมดจะสืบทอดจาก BaseViewModel และ BaseController ตามลำดับ
รหัส:
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!";
}
}
สังเกตการใช้OnActionExecutedตามที่นำมาจากโพสต์ 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>
หวังว่านี่จะช่วยได้