带有 IEnumerable<child> 成员的 ViewModel 在 POST 上未正确绑定 [重复]

Posted

技术标签:

【中文标题】带有 IEnumerable<child> 成员的 ViewModel 在 POST 上未正确绑定 [重复]【英文标题】:ViewModel with IEnumerable<child> member not bound correctly on POST [duplicate] 【发布时间】:2011-08-29 00:41:25 【问题描述】:

我有一个包含子视图模型的 IEnumerable 的视图模型。当我为父级和子级创建一个编辑表单,然后发布它时,只有视图模型的父级部分被填充; IEnumerable 属性保持为空。

视图模型:

public class FamilyViewModel 


    public int idFamily  get; set; 
    public string FamilyName  get; set; 
public IEnumerable<MemberViewModel> Members  get; set; 



public class MemberViewModel 


    public int idMember  get; set; 
    public int idFamily  get; set; 
    public string FirstName  get; set; 

FamilyController.cs

 [HttpGet]
public ActionResult Edit(int id)

    var family = unitOfWork.FamilyRepository.Single(f => f.idFamily == id);
    FamilyViewModel viewModel = Mapper.Map<family, FamilyViewModel>(family);
            /* at this point, viewModel.Members is populated correctly */
    return View(viewModel);


[HttpPost]
public ActionResult Edit(FamilyViewModel viewModel)

    /* at this point, viewModel.Members is null */
    return View(viewModel);

编辑.cshtml

@model FamilyViewModel

@using (Html.BeginForm())

@Html.EditorFor(s => Model, "Family")

@foreach (MemberProfileViewModel m in Model.Members)

   @Html.EditorFor(o => m, "Member")


@Html.Submit()

表单已正确生成。如果我重铸 Edit 方法以使用 FormCollection,则家庭和每个成员的值都会正确接收。不过,我更喜欢使用强类型的 ViewModel。

一条可能相关的信息:每个子表单控件都有相同的 ID;也就是说,每个 MemberViewModel 都有&lt;INPUT TYPE="text" ID="m_FirstName"&gt;——它们没有以任何方式编入索引,这是我所预料的。

【问题讨论】:

【参考方案1】:

I asked a similar question。我将我使用的解决方案放在我的问题正文中。我相信它也可能对你有帮助。通过消除foreach,视图元素最终将被绑定回底层视图模型。希望对你有帮助。

【讨论】:

以上是关于带有 IEnumerable<child> 成员的 ViewModel 在 POST 上未正确绑定 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

EF4 complex Select():从业务层返回 IEnumerable 或 IEnumerable<MyCustomDto>?

在List之间自由转换 和IEnumerable

Grails g:每个标签

ProtoBuf-net 序列化 IEnumerable<T>

使用 jQuery 在树 (SVG) 中间插入 (g) 节点

css经验总结