【问题标题】:mvc collection in model模型中的 mvc 集合
【发布时间】:2014-02-20 03:03:30
【问题描述】:

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

型号:

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 的集合将仅显示一项(以显示的为准)。要捕获整个集合,我必须遍历整个集合并为每个不是当前选定对象的对象使用隐藏字段(这是一个相当复杂的模型)还是有更好的方法我应该这样做?

【问题讨论】:

    标签: asp.net-mvc-4 razor


    【解决方案1】:

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

    如果在您的场景中,来自 Controller -> View(呈现页面时)与来自 View -> Controller(发布时)的信息不同,那么您实际上应该使用两个单独的 ViewModel,以不同的方式表示数据。

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

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

    现在,如果您真的别无选择,只能将整个集合从视图重新发送到控制器,那么您将不得不为每个项目和其中的每个属性创建隐藏的输入元素。

    【讨论】:

    • +1 我考虑过不同的模型,但找不到一个很好的例子。不幸的是,我确实有用户输入要传回。是否有可能在帖子而不是集合上拥有我的对象的单个实例,或者它总是会发送一个包含一个项目的集合?
    • 好吧,你可以发布任何你想要的东西。最终,您将声明某个模型作为您的操作的参数,如果在 HTTP Post 中,值与您的参数对象的属性名称匹配,它将由默认绑定器自动创建。请记住,表单帖子对对象一无所知,它只是发布表单值。它是从这些值中提取视图模型的默认绑定器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2017-04-02
    相关资源
    最近更新 更多