繁体   English   中英

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

[英]ASP.Net MVC ViewModel contains List<anotherViewModel> dynamically add list entry for anotherViewModel

我找不到并解决如何通过加载在编辑视图中的另一个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必须有一些解决方案,但是我找不到。

谢谢你的帮助。

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

<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列表,在部分视图中,您将具有anotherViewModel的html标记。 当用户编辑了现有视图和/或添加了新元素后,“提交”按钮将把整个viewmodel和anotherViewModels列表发布到您的操作中。 然后,该操作将处理添加和更新。

但是,这确实仅适用于并发异常几率低的应用程序。 一种更平滑的方法是让每个局部视图对其包含的数据负责,并通过ajax对其进行持久化。 这样就无需一次性发布所有更改。

您的视图模型将在剃须刀助手的帮助下转换为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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM