【问题标题】:Problems model binding nested list in ASP.NET MVCASP.NET MVC 中的问题模型绑定嵌套列表
【发布时间】:2014-07-10 20:03:41
【问题描述】:

我正在尝试将视图绑定到包含列表中列表的模型。自然我更喜欢使用开箱即用的模型绑定。昨天花了一些时间,我发现了一个真正的解决方法,我想纠正这个问题。我的模型的基本结构如下:

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】:

    您必须在 Category 类中使​​用 Properties 而不是 Fields:

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

    【讨论】:

    • 谢谢,发现了!!我正在从系统的类似故障部分重用另一个开发人员的模型。这可以解释原因。
    • 如果您在集合值的中间删除会发生什么(例如,您有一个动态网格以使用内联删除按钮显示它)。模型绑定是否仍然有效或出错。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多