在ASP.NET MVC中绑定嵌套列表模型的问题

问题描述 投票:3回答:1

我正试图将一个视图绑定到一个模型上,这个模型包含一个列表中的列表。当然,我更喜欢使用开箱即用的模型绑定。昨天花了一些时间,我发现了一个变通的方法,这其实是一个黑客,我想纠正一下。我的模型的基本结构如下。

public class MyMPIModel
{
    public List<ScoreInfo> ScoreInfo { get; set; }
}

public class ScoreInfo 
{
    public int ScorePrefId { get; set; }
    public List<Category> Categories { get; set; }
}

public class Category
{
    public int Id;
    public string Name;
    public bool Checked;
}

视图InterestCategories.cshtml包含以下表单。

@using (Html.BeginForm())
{
    for (var i = 0; i < Model.ScoreInfo.Count; i++)
    {
        @Html.EditorFor(x => x.ScoreInfo[i])
    }
}

编辑模板 ScoreInfo.cshtml。

@Html.HiddenFor(x => x.ScorePrefId)
<div class="preferences-block">
    @for (var i = 0; i < Model.Categories.Count; i++)
    {
        @Html.EditorFor(x => x.Categories[i])
    }
</div>

最后是编辑器模板Category.cshtml。

@Html.HiddenFor(x => x.Id)
@Html.HiddenFor(x => x.Name)
<label>
    @Html.CheckBoxFor(x => x.Checked, new { @class = "check"})
    <span>@Model.Name</span>
</label>

使用firebug检查表单,我可以看到所有的隐藏字段都被填充了。而且当我提交表单时,Fiddler显示了正确的数据。这里是一个示例。

ScoreInfo[0].Categories[1].Id   2
ScoreInfo[0].Categories[1].Name Managing Money
ScoreInfo[0].Categories[1].Checked  false

然而,当我发布到控制器,设置一个断点并检查模型时,ScoreInfo对象的列表已经被填充,但ScoreInfo对象中的Category对象列表却没有。

我的控制器中有以下POST操作。

[HttpPost]
public ActionResult InterestCategories(MyMPIModel model, FormCollection form)
{
    ...

    //  model would not bind forcing me to populate via form collection
    for (var i = 0; i < model.ScoreInfo.Count; i++)
    {
        ...
        for (var j = 0; j < scoreInfo.Categories.Count; j++)
        {
                var category = scoreInfo.Categories[j];

                var prefix = "ScoreInfo[" + i + "].Categories[" + j + "]";

                category.Name = form[prefix + ".Name"];

                var sId = form[prefix + ".Id"];
                if (sId != null) category.Id = Int32.Parse(sId);

                var sChecked = form[prefix + ".Checked"];
                if (sChecked != null) category.Checked = sChecked.Contains("true");
        }
    }
}
c# .net asp.net-mvc asp.net-mvc-4 razor
1个回答
6
投票

你必须在你的Category类中使用属性而不是字段。

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.