我有一个ViewModel,它有一个包含其他列表对象的列表对象,并希望将其绑定到视图。
到目前为止我所做的是循环遍历第一个列表:
for (int i = 0; i < Model.ThFirstList.Count(); i++ )
{
Html.EditorFor(model => model.TheFirstList[i] , "myView")
}
在“myView”中循环浏览另一个列表,如下所示:
for (int i = 0; i < Model.TheSecondList.Count(); i++ )
{
%><%: Html.DropDownListFor(m => m.TheSecondList[i].ThePropertyIWantToSet, aList)%><%
}
一切看起来很好,在客户端(我认为),选择字段的名称是这样的:
TheFirstList[0].TheSecondList[0].ThePropertyIWantToSet
当我不从任何选择框中选择任何内容并回发数据时,则设置TheFirsList和TheSecendList对象。但是,如果我在列表中选择一个值,我会从服务器返回错误代码500。我的猜测是它找不到任何匹配的Controller方法请求?因此,我无法设置ThePropertyIWantToSet属性。
任何人都可以帮我这个吗?
谢谢!
答案 0 :(得分:2)
查看视图模型可能更有帮助,但通常在从视图模型渲染选择列表时,我使用两个单独的属性:一个用于存储选定的值,另一个用于实际保存列表本身。
答案 1 :(得分:2)
我只是使用视图模型和编辑器模板,而不是打扰foreach循环等。它让生活更轻松。
首先从视图模型开始:
public class MyViewModel
{
public IEnumerable<Type1> TheFirstList { get; set; }
}
public class Type1
{
public IEnumerable<Type2> TheSecondList { get; set; }
}
public class Type2
{
public string ThePropertyIWantToSet { get; set; }
public IEnumerable<SelectListItem> Items
{
get
{
return new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
};
}
}
}
然后是控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
// filling with dummy values => those should probably
// come from your data store
var model = new MyViewModel
{
TheFirstList = Enumerable.Range(1, 2).Select(x => new Type1
{
TheSecondList = Enumerable.Range(1, 3).Select(y => new Type2())
})
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
然后对应~/Views/Home/Index.cshtml
视图:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.TheFirstList)
<input type="submit" value="OK" />
}
~/Views/Home/EditorTemplates/Type1.cshtml
模板:
@model Type1
@Html.EditorFor(x => x.TheSecondList)
最后是~/Views/Home/EditorTemplates/Type2.cshtml
模板:
@model Type2
@Html.DropDownListFor(
x => x.ThePropertyIWantToSet,
new SelectList(Model.Items, "Value", "Text")
)
现在,在POST操作中,您将获得一个漂亮且正确绑定的视图模型。编辑器模板将负责生成正确的输入字段名称。看看代码是多么容易和干净。无需在视图中编写任何循环,担心正确的索引,...只需将其留给框架。