Asp.net mvc 2 在MVC视图中编辑IEnumerable模型属性

Asp.net mvc 2 在MVC视图中编辑IEnumerable模型属性,asp.net-mvc-2,Asp.net Mvc 2,我遇到需要在视图模型中编辑可枚举属性的情况: public class ViewModel { public MyObj Obj { get; set; } public IEnumerable<MyObj> MyObjs = new List<MyObj>(); } 公共类视图模型 { 公共MyObj{get;set;} public IEnumerable MyObjs=新列表(); } 我跟随了波斯特;控制器操作: public ActionRe

我遇到需要在视图模型中编辑可枚举属性的情况:

public class ViewModel
{
    public MyObj Obj { get; set; }
    public IEnumerable<MyObj> MyObjs = new List<MyObj>();
}
公共类视图模型
{
公共MyObj{get;set;}
public IEnumerable MyObjs=新列表();
}
我跟随了波斯特;控制器操作:

public ActionResult Index()
{
    var viewModel = new ViewModel();
    viewModel.Obj = new Obj() { Name = "0", Value = true };
    var o1 = new MyObj() { Name = "1", Value = false };
    var o2 = new MyObj() { Name = "2", Value = false };
    viewModel.Objs = new List<Obj>() { o1, o2 };

    return View(viewModel);
}

[HttpPost]
public ActionResult Index(ViewModel viewModel)
{
    return View(viewModel);
}
public ActionResult Index()
{
var viewModel=新的viewModel();
viewModel.Obj=newobj(){Name=“0”,Value=true};
var o1=newmyobj(){Name=“1”,Value=false};
var o2=new MyObj(){Name=“2”,Value=false};
Objs=newlist(){o1,o2};
返回视图(viewModel);
}
[HttpPost]
公共行动结果索引(ViewModel ViewModel)
{
返回视图(viewModel);
}
索引视图如下所示:

<% using (Html.BeginForm()) { %>

    <table>
        <tr>
            <th>Name</th>
            <th>Value</th>
        </tr>
        <%= Html.EditorFor(x => x.Objs) %>
    </table>

    <br />

    <input type="submit" value="Submit" />

<% } %>

名称
价值
x、 Objs)%%>

以及“~/Views/Home/EditorTemplates/Obj.ascx”中的编辑器模板:


x、 名称)%%>
x、 值)%%>
问题是:浏览到索引,数据就会显示出来。POST,可枚举数据消失。通过单步执行,视图模型中的单个“Obj”仍然存在,因此正在消失的只是可枚举数据

我已经盯着这个看了一段时间了,如果有人能帮上忙的话,那就太棒了

干杯

Tim.

看看Phil Haack,MVC2不支持将列表绑定回viewmodel,除非您进行一些操作


更新:我对此做了更多的研究,认为您应该尝试添加
TryUpdateModel(viewModel.MyObjs,“MyObjs”)到您的控制器。这会通知modelbinder,它应该使用“MyObjs”绑定前缀将表单中的数据附加到ViewModel中的集合。

我在本文中发现的唯一区别是使用了“for”语句。不幸的是,这并没有产生任何不同的HTML或任何不同的结果。您是否检查了视图中生成的HTML?是否所有Obj编辑器都具有相同的名称/id?它们应该由索引器生成(即
)再次感谢您的帮助,Stephen。不幸的是,它们似乎是对的,例如name=“MyObjs[0].name”和“MyObjs[1].name”——因此我没有任何线索!更新我的答案后,尝试使用
TryUpdateModel(viewModel.MyObjs,“MyObjs”)在你的控制器中,这太棒了-它可以工作。这花费了相当长的时间,但添加TryUpdateModel已经完成了这一任务。非常感谢,伙计!
    <tr>
        <td><%: Html.TextBoxFor(x => x.Name) %></td>
        <td><%: Html.CheckBoxFor(x => x.Value) %></td>
    </tr>