如何将列表列表绑定到视图

时间:2011-06-10 13:55:42

标签: asp.net asp.net-mvc asp.net-mvc-3

我有一个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属性。

任何人都可以帮我这个吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

查看视图模型可能更有帮助,但通常在从视图模型渲染选择列表时,我使用两个单独的属性:一个用于存储选定的值,另一个用于实际保存列表本身。

ViewModels with SelectList Design Decison

答案 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操作中,您将获得一个漂亮且正确绑定的视图模型。编辑器模板将负责生成正确的输入字段名称。看看代码是多么容易和干净。无需在视图中编写任何循环,担心正确的索引,...只需将其留给框架。