【问题标题】:Collection not returning in model集合未在模型中返回
【发布时间】:2014-02-13 19:06:28
【问题描述】:

我有一个从视图模型填充的视图,其中一个属性是复杂类型的集合。视图正确呈现,列表被迭代到一个表中,其中每个尚未选择的项目都有一个单选按钮。当我提交表单时,我无法将对象列表返回到模型中,并且我无法弄清楚我做错了什么。集合中的每个项目都添加到视图中,如下所示:

@for (int i = 0; i < Model.Items.Count; i++
    var rowClass = "selectRow";

    if (item.IsSelected)
    {
        rowClass = "success";
    }


    <tr class="@rowClass">
        @Html.HiddenFor(m => m.Items[i].PropertyOne)
        <td>
            @Html.DisplayFor(m =>  m.Items[i].PropertyTwo)
        </td>
        <td class="actions">
            // only those items not previously selected need a radio button
            @if (item.IsSelected == false)
            {
                @Html.RadioButtonFor(m =>  m.Items[i].IsSelected,  m.Items[i].PropertyOne, new { id = "IsSelected_" +  m.Items[i].PropertyOne })
            }
        </td>
    </tr>
}

我尝试使用 @Html.HiddenFor(x => x.PropertyOne) 但我无法将选定值的集合绑定回模型。我可以使用隐藏字段返回模型中的所有其他内容,但我不知道如何解决这个问题。任何帮助表示赞赏。

谢谢

【问题讨论】:

  • 了解这里发生了什么的最好方法是在您发帖时查看Model.Items 在线上的内容。你用过提琴手吗? telerik.com/fiddler。还是萤火虫?

标签: asp.net-mvc asp.net-mvc-4 html-helper


【解决方案1】:

如果您希望集合正确发布到模型活页夹,则不能使用foreach 循环(除非您使用EditorFor,请参阅评论)。您必须使用良好的老式for 循环,并让您的收藏源自IList。请参阅我的问题和答案here 了解更多信息。

此外,您要发布的集合对象类型的任何属性,您需要确保它在循环中使用。所以,假设你的 Item 类看起来像这样:

public class Item
{
    public int ItemId { get; set; }
    public string ItemDescription { get; set; }
    public bool IsSelected { get; set; }
}

...您的循环可能如下所示:

@for(var i = 0;i < Model.Items.Count; i++)
{
    <tr>
        @Html.HiddenFor(m => Model.Items[i].ItemId)
        <td>
             @Html.TextBoxFor(m => Model.Items[i].Description)
        </td>
        <td>
             @Html.CheckBoxFor(m => Model.Items[i].IsSelected)
        </td>
    </tr>
}

还需要注意的是,仅显示模型属性不会发布它。意思是……

@Model.Items[i].Description

...不会发布,而是将其隐藏或在 HTML 元素中使用...

@Html.HiddenFor(m => Model.Items[i].Description)

将正确发布和绑定。

Phil Haack 关于此主题的权威文章之一可以在here 找到。

【讨论】:

  • 我已经看过这个,但是当我将 foreach 更改为 for 循环时,无法提交视图。
  • 查看我的编辑,并在原始问题中发布带有for 循环的修改后的代码作为编辑,这样我们就可以看到你有什么。
  • 嗨@AJ,你的答案是正确的。一件事是它不必使用for,你仍然可以使用foreach。看看这个链接:stackoverflow.com/questions/20842935/…
  • @Lin - 谢谢,我不知道EditorFor 会处理foreach
  • @crunchy - 我不相信DisplayFor 会绑定,除了for 循环中缺少右括号外,您的代码看起来还可以。您是否已拨弄它以查看发布的内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多