2011-06-10 75 views
0

我有一个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。我的猜测是,它找不到任何匹配的控制器方法的请求?因此,我无法设置ThePropertyIWantToSet属性。

任何人都可以帮助我吗?

谢谢!

回答

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操作,你会得到一个不错的和正确绑定视图模型。编辑器模板将负责生成正确的输入字段名称。看看代码是多么简单和干净。不需要在视图中编写任何循环,担心适当的索引,只需将其留给框架即可。

+0

谢谢!我会试试这个。 – picknick 2011-06-10 16:38:34

2

看到您的视图模型可能会更有帮助,但通常从视图模型渲染选择列表时,我使用两个单独的属性:一个存储选择的值和其他实际持有列表本身。

ViewModels with SelectList Design Decison