ASP.Net MVC ViewModel包含List <anotherviewmodel>为anotherViewModel动态添加列表条目</anotherviewmodel>

时间:2014-03-28 08:50:46

标签: 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; set; }
public string description{ get; set; }
public List<anotherViewModel> aViewModel { get; set; }
}

用户加载包含ViewModel的编辑视图,该视图当前有2个类型为anotherViewModel的托管。

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

另一个ViewModel处于局部视图中。我试图用ajax重新加载它,如果我这样做,在当前模型中所做的更改将丢失。因为我无法将模型移交给控制器。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

传统方式(伪代码): 在您的视图中,您可以创建以下内容:

<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>

您的页面将列出anotherViewModel列表,在局部视图中,您将获得另一个ViewModel的html标记。当用户编辑现有元素和/或添加新元素时,提交按钮会将整个视图模型与另一个ViewModel列表一起发布到您的操作中。然后,该操作将处理添加和更新。

但是,这确实只适用于并发异常可能性较低的应用程序。更顺畅的方法是让每个局部视图对其包含的数据负责,并通过ajax保存它。这将无需一次性发布所有更改。

答案 1 :(得分:0)

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

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)

否则,也许您应该重新考虑您的数据结构。也许有一个单独的局部视图,您可以在其中编辑anotherViewModel。