一个常见的解决方案是制作一个包含布局文件中使用的属性的基本视图模型,然后从基本模型继承到各个页面上使用的模型。
这种方法的问题在于,您现在将自己锁定在模型只能从另一个类继承的问题中,并且您的解决方案可能是您无法在您想要的模型上使用继承。
我的解决方案也是从基本视图模型开始的:
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; }
}
有了这个解决方案,我就不再需要在布局模型和模型之间进行继承了。
所以现在我可以继续使用 Layout.cshtml 中的 LayoutModel,如下所示:
@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");
}