Распространенным решением является создание модели базового вида, которая содержит свойства, используемые в файле макета, а затем наследуется от базовой модели к моделям, используемым на соответствующих страницах.
Проблема с этим подходом заключается в том, что вы теперь заперты в проблеме модели, которая может наследоваться только от одного другого класса, и, возможно, ваше решение таково, что вы все равно не можете использовать наследование для модели, которую вы намеревались.
Мое решение также начинается с модели базового вида:
public class LayoutModel
{
public LayoutModel(string title)
{
Title = title;
}
public string Title { get;}
}
Затем я использую общую версию LayoutModel, которая наследуется от LayoutModel, например:
public class LayoutModel<T> : LayoutModel
{
public LayoutModel(T pageModel, string title) : base(title)
{
PageModel = pageModel;
}
public T PageModel { get; }
}
С этим решением я отключил необходимость наследования между моделью макета и моделью.
Так что теперь я могу пойти дальше и использовать LayoutModel в Layout.cshtml следующим образом:
@model LayoutModel
<!doctype html>
<html>
<head>
<title>@Model.Title</title>
</head>
<body>
@RenderBody()
</body>
</html>
И на странице вы можете использовать универсальный LayoutModel, например так:
@model LayoutModel<Customer>
@{
var customer = Model.PageModel;
}
<p>Customer name: @customer.Name</p>
Из вашего контроллера вы просто возвращаете модель типа LayoutModel:
public ActionResult Page()
{
return View(new LayoutModel<Customer>(new Customer() { Name = "Test" }, "Title");
}