在ASP.Net MVC中从视图传递到模型时列表计数为空

时间:2013-05-14 21:38:09

标签: asp.net-mvc asp.net-mvc-4 model-binding

在开始之前,我已经看过这个问题了:

asp.net mvc model binding fails for <List> items in editor template

我有一个看起来如此的模型:

public class PartnerListModel
{
    public List<PartnersModel> Partners { get; set; }

    public PartnerListModel()
    {
        Partners = new List<PartnersModel>();
    }
}

然后我的PartnersModel看起来像这样:

public class PartnersModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

我将PartnersListModel传递给视图,如下所示:

using (Html.BeginForm("Update", "Partners", FormMethod.Post))
            {
                @Html.EditorFor(m => m.Partners)
                <input type="submit" value="Submit Changes"/>
            }

最后,我的编辑器模板如下所示:

@model AdminWebsite.Models.Partners.PartnersModel
<div>
    <span>
        @Html.DisplayFor(m => m.Name)
    </span>
    <span>
        @Html.EditorFor(m => m.IsActive)
    </span>
    @Html.HiddenFor(m => m.ID)
    @Html.HiddenFor(m => m.Name)
</div>

我的控制器的操作是这样的,并且代码实际上设法实现此操作:

public ActionResult Update(PartnerListModel partners)

为什么我的模型中的List的计数为0?我找不到任何理由为什么我的示例与Stack Overflow上接受的答案不同。我有什么遗漏可以解释为什么传回的数据值没有被添加到列表中吗?

使用Chrome的开发者工具我已经确认我有一个类似于以下内容的列表:

  • 合作伙伴[0] .IsActive = true
  • 合作伙伴[0] .IsActive = false
  • 合作伙伴[0] .Name =“嗨”
  • 合作伙伴[0] .ID = 1
  • 合作伙伴[1] .IsActive = false 等

有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

您将List<PartnersModel>传递给操作方法,但操作方法需要PartnerListModel

您应该像这样更改Action方法:

public ActionResult Update(List<PartnersModel> partners)

原因是默认的ModelBinder实际上没有嵌套图形。如果您想要访问这两个项目,则需要包括两个参数:

public ActionResult Update(PartnerListModel partnerlistmodel, List<PartnersModel> partners){

}

如果你想要一个嵌套模型,你必须实现自己的模型绑定器。

以下问题也存在类似问题:Binding an editable list of children