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>