C# 如何在ASP.NET MVC中创建复杂的视图模型?
创建和更新复杂的视图模型是我在从事web项目时经常遇到的问题 例如,我得到了一个C# 如何在ASP.NET MVC中创建复杂的视图模型?,c#,asp.net-mvc,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Asp.net Mvc Viewmodel,创建和更新复杂的视图模型是我在从事web项目时经常遇到的问题 例如,我得到了一个PageViewModel,它需要一个背景图像URL和一个页面标题来传递给\u Layout.cshtml,所以 @model WebApplication.ViewModels.PageViewModel <body background-image=@Model.BackgroundImageUrl> ... </body 就像 public IActionResult Contact
PageViewModel
,它需要一个背景图像URL和一个页面标题来传递给\u Layout.cshtml
,所以
@model WebApplication.ViewModels.PageViewModel
<body background-image=@Model.BackgroundImageUrl>
...
</body
就像
public IActionResult Contact(int contactId)
{
...
var viewmodel = new PageViewModel
{
BackgroundImageUrl = ...,
ContactViewModel = new
{
...
}
}
}
这对我来说是一个灾难
在POST
上,情况变得更糟,因为理想情况下,我只发布与所讨论的操作相关的字段,即
public IActionResult Contact(ContactViewModel viewmodel)
{
if (ModelState.IsValid)
{
... (this is the easy case)
return RedirectToAction(...)
}
... (now we have a problem)
}
如果在POST
操作中出现任何错误,我需要重建整个视图模型图,这对于上面的示例来说并不太糟糕,但在现实世界的应用程序中,这会变得非常混乱,非常快(只需考虑使用存储区中的数据填充下拉列表)。控制器的动作应该是精益的,不是吗?让视图模型负责检索它们自己的数据也感觉不对,所以我可能应该提出一个视图模型工厂。这反过来会产生过多的工厂,每个视图模型对应一个工厂,这同样会变得混乱
我想知道是否有更好的方法。 < P>一个可能的考虑是使用一个负责部分布局。 例如,您可以使用以下子操作来填充背景图像URL:
[ChildActionOnly]
public ActionResult BackgroundImage()
{
var model = new MyViewModel
{
BackgroundImageUrl = ...
};
return PartialView(model);
}
然后有一个相应的局部视图:
@model MyViewModel
<img src="@Model.BackgroundImageUrl" alt="" />
@model MyViewModel
可以包含在主布局中(在本例中,主布局不需要视图模型,因为它的不同部分将由子操作组装而成):
@Action(“BackgroundImage”,“SomeController”)
...
使用这种方法,负责渲染视图的主操作不需要知道和组装复杂的视图模型。它将只关注其特定的视图模型
@model MyViewModel
<img src="@Model.BackgroundImageUrl" alt="" />
<body>
@Html.Action("BackgroundImage", "SomeController")
...
</body>