Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET MVC中创建复杂的视图模型?_C#_Asp.net Mvc_Asp.net Mvc Viewmodel - Fatal编程技术网

C# 如何在ASP.NET MVC中创建复杂的视图模型?

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

创建和更新复杂的视图模型是我在从事web项目时经常遇到的问题

例如,我得到了一个
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>