아마도 이것의 주요 사용 사례는 모든 (또는 대부분의) 컨트롤러 작업에 대한보기에 기본 모델을 가져 오는 것입니다.
이를 감안할 때 저는 이러한 답변 중 몇 가지를 조합하여 사용했습니다. Colin Bacon의 답변에 대한 기본 지원입니다.
뷰로 돌아 가기 위해 뷰 모델을 채우고 있기 때문에 이것이 여전히 컨트롤러 로직이라는 것은 맞습니다. 따라서 이것을 놓을 올바른 위치는 컨트롤러에 있습니다.
우리는 레이아웃 페이지에 이것을 사용하기 때문에 모든 컨트롤러에서 이것이 일어나기를 원합니다. 레이아웃 페이지에서 렌더링되는 부분보기에 사용하고 있습니다.
우리는 또한 강력한 형식의 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>
도움이 되었기를 바랍니다.