模型中的mvc集合

时间:2014-02-19 18:47:54

标签: asp.net-mvc-4 razor

我有一种情况,在我的模型中有一个集合之前我从未遇到过,但我一次只显示一个项目。这是一个简单的例子......

型号:

public class MyViewModel
{
    //some other fields

    public IList<SomeObject> MyCollection { get; set; }
}

查看:

@model MyViewModel

<ul>
    for(int i; i < Model.MyCollection.Count(); i++)
    {
        //user can select an item from list and for the chosen item,
        //show fields to edit below

        <li>@Model.MyCollection[i].Name;
    }
</ul>

@Html.LabelFor(m => m.MyCollection[TempData["Index"]].SomeProperty)
@Html.TextBoxFor(m => m.MyCollection[TempData["Index"]].SomeProperty)

//other fields

这包含在部分视图中的表单中,当用户从名称列表中选择项目并且其选择反映在TempData["Index"]中时,该表单会刷新。

我的问题是,当我将此发布到我的控制器(期望MyViewModel model)时,内部MyCollection的集合将仅显示一个项目(以显示的为准)。要捕获整个集合,我必须循环遍历整个集合并为每个不是当前所选对象的对象使用隐藏字段(这是一个非常复杂的模型)还是有更好的方法我应该这样做?

1 个答案:

答案 0 :(得分:2)

请记住,ViewModels不是ViewState,因为所有这些都是作为Asp.Net WebForms发布回服务器的。

如果在您的方案中,您有来自Controller的不同信息 - &gt;查看(在渲染页面时)而不是从视图 - &gt;控制器(发布时),那么你应该实际使用两个单独的ViewModel,以不同的方式表示数据。

例如,在发布时,您可能只发布所选项的ID,并且控制器将在内部使用整个集合(可能来自数据库或类似的东西)重新创建MyViewModel

视图应避免发送大量不是来自用户的实际输入数据。

现在,如果除了将整个集合从视图重新发送到控制器之外别无选择,那么您必须为每个项目及其中的每个属性创建隐藏的输入元素。