C# ASP.Net MVC视图模型包含列表<;另一个视图模型>;为另一个ViewModel动态添加列表项

C# ASP.Net MVC视图模型包含列表<;另一个视图模型>;为另一个ViewModel动态添加列表项,c#,asp.net-mvc,asp.net-mvc-4,mvvm,C#,Asp.net Mvc,Asp.net Mvc 4,Mvvm,我无法找到并解决如何通过“编辑”视图中加载的另一个ViewModel动态添加ViewModel条目的问题 假设我有一个ViewModel,其中包含另一个ViewModel的列表 数据库模型: public class ViewModel { public ViewModel() { anotherViewModel= new List<anotherViewModel>(); } public string idViewModel{ get;

我无法找到并解决如何通过“编辑”视图中加载的另一个ViewModel动态添加ViewModel条目的问题

假设我有一个ViewModel,其中包含另一个ViewModel的列表

数据库模型:

public class ViewModel
{
    public ViewModel()
    {
        anotherViewModel= new List<anotherViewModel>();
    }

public string idViewModel{ get; set; }
public string description{ get; set; }
public List<anotherViewModel> aViewModel { get; set; }
}
公共类视图模型
{
公共视图模型()
{
anotherViewModel=新列表();
}
公共字符串idViewModel{get;set;}
公共字符串说明{get;set;}
公共列表aViewModel{get;set;}
}
用户加载包含ViewModel的编辑视图,该视图当前有两个类型为anotherViewModel的入口

用户应该可以将另一个类型为anotherViewModel的条目添加到ViewModel,甚至可以更改另一个ViewModel条目的属性

另一个ViewModel位于局部视图中。我尝试用ajax重新加载它,如果我这样做,在当前模型中所做的更改就会丢失。因为我不能把模型交给控制器

我知道jquery一定有一些解决方案,但我找不到

感谢您的帮助。

传统方式(伪代码): 在您看来,您可以创建如下内容:

<form>
Your html code for ViewModel properties.
create list of partials:
@foreach(anotherModel in Model.aViewModel)
{
   @Html.Partial("_yourPartialView", anotherViewModel)
}
Code for adding a new anotherView element.
ie: @Html.Partial("_createNewElement", new anotherViewModel)
<submit button>
</form>

查看模型属性的html代码。
创建分区列表:
@foreach(Model.aViewModel中的anotherModel)
{
@Html.Partial(“_yourPartialView”,另一个视图模型)
}
用于添加新的其他视图元素的代码。
ie:@Html.Partial(“\u createNewElement”,新的另一个视图模型)
您的页面将列出另一个视图模型列表,并且在部分视图中,您有另一个视图模型的html标记。当用户编辑了现有的视图模型和/或添加了新元素后,submit按钮会将整个viewmodel以及其他ViewModels的列表发布到您的操作中。然后,该操作将处理添加和更新


然而,这往往只适用于并发异常几率较低的应用程序。一种更平滑的方法是让每个局部视图负责它所包含的数据,并通过ajax将其持久化。这将消除一次性发布所有更改的需要。

您的viewmodel将在razor助手的帮助下转换为html元素。当用户在客户端上编辑viewmodels数据时,实际上是在编辑html。当您发回控制器时,mvc中的默认模型绑定器将尝试将您的post数据转换为控制器操作期望作为参数的模型。当你有复杂的模型时,它会变得有点棘手。您是否尝试过构建自定义模型绑定器

public class CustomBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, 
                        ModelBindingContext bindingContext)
{
    HttpRequestBase request = controllerContext.HttpContext.Request;

    string idViewModel= request.Form.Get("idViewModel");
    string description= request.Form.Get("description");
    var list = new List<anotherViewModel>(); //create list from form data


    return new ViewModel
               {
                   idViewModel= idViewModel,
                   description= description,
                   aViewModel = list
               };
}
否则,也许您应该重新考虑您的数据结构。可能有一个单独的局部视图,您可以在其中编辑另一个视图模型

public ActionResult Edit([ModelBinder(typeof(CustomBinder))] ViewModel vm)