संभवतः, इसके लिए प्राथमिक उपयोग का मामला सभी (या बहुसंख्यक) नियंत्रक क्रियाओं के लिए बेस मॉडल प्राप्त करना है।
यह देखते हुए कि, मैंने इनमें से कई उत्तरों के संयोजन का उपयोग किया है, कॉलिन बेकन के उत्तर पर प्राथमिक सूअर का बच्चा।
यह सही है कि यह अभी भी नियंत्रक तर्क है क्योंकि हम किसी दृश्य पर वापस लौटने के लिए एक दृश्यदर्शी को आबाद कर रहे हैं। इस प्रकार इसे लगाने का सही स्थान नियंत्रक में है।
हम चाहते हैं कि यह सभी नियंत्रकों पर हो क्योंकि हम इसका उपयोग लेआउट पृष्ठ के लिए करते हैं। मैं इसे आंशिक विचारों के लिए उपयोग कर रहा हूं जो लेआउट पृष्ठ में दिए गए हैं।
हम अभी भी दृढ़ता से टाइप किए गए ViewModel के अतिरिक्त लाभ चाहते हैं
इस प्रकार, मैंने एक BaseViewModel और BaseController बनाया है। सभी ViewModels नियंत्रक क्रमशः 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!";
}
}
इस SO पोस्ट से लिए गए OnActionExecuted के उपयोग पर ध्यान दें
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>
उम्मीद है कि यह मदद करता है।