2011-12-06 43 views
1

我有一个情况我需要在一个视图模型编辑枚举属性:编辑IEnumerable的模型属性在MVC视图

public class ViewModel 
{ 
    public MyObj Obj { get; set; } 
    public IEnumerable<MyObj> MyObjs = new List<MyObj>(); 
} 

我按照this后;控制器动作:

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); 
} 

索引视图如下:

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

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

    <br /> 

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

<% } %> 

而在 “〜/查看/主页/ EditorTemplates/Obj.ascx” 编辑模板:

<tr> 
     <td><%: Html.TextBoxFor(x => x.Name) %></td> 
     <td><%: Html.CheckBoxFor(x => x.Value) %></td> 
    </tr> 

的问题是:浏览到索引,数据显示出来。 POST和可枚举数据消失。逐步浏览,视图模型中的单数“Obj”仍然存在,因此它只是可消失的可枚举数据。

我一直在盯着这个一段时间,如果有人能帮上忙,那就太棒了。

干杯,

Tim。

回答

0

看看菲尔哈克的this post,MVC2本身不支持将列表绑定到视图模型,除非您进行一些操作。

更新:我已经仔细研究了这一点,并认为您应该尝试将TryUpdateModel(viewModel.MyObjs, "MyObjs");添加到您的控制器。这会通知模型绑定器它应该使用“MyObjs”绑定前缀将表单中的数据附加到ViewModel中的集合中。

+0

我能够在这篇文章中发现的唯一区别是使用“for”语句。这不会产生任何不同的HTML或任何不同的结果。 – Hanshan

+0

您是否检查过在您的视图中生成的HTML?所有的Obj编辑器都有相同的名称/编号吗?它们应该使用索引器生成(即'') –

+0

再次感谢您的帮助,Stephen。不幸的是,它们似乎是正确的 - 例如名称=“MyObjs [0] .Name”和“MyObjs [1] .Name” - 因此我不知道! – Hanshan

相关问题