模型绑定不适用于MVC回发但formdata似乎没问题

时间:2014-10-19 09:55:07

标签: c# asp.net-mvc asp.net-mvc-5

我有以下ViewModel:

public class ConfigOptionsViewModel
{
    public List<ConfigOptionGroupViewModel> GroupOptions { get; set; }
}

public class ConfigOptionGroupViewModel
{
    public string GroupName { get; set; }
    public List<ConfigOptionTypeViewModel> ConfigOptionTypes { get; set; }
}

public class ConfigOptionTypeViewModel
{
    public ConfigOptionFieldType Type { get; set; }
    public List<ConfigOptionViewModel> ConfigOptions { get; set; }
}

public class ConfigOptionViewModel
{
    public string Name { get; set; }
    public string Value { get; set; }
    public string Tooltip { get; set; }
}

然后我认为这是:

@for (var i = 0; i < Model.GroupOptions.OrderBy(m => m.GroupName).Count(); i++)
{
    <div class="tab-pane" id="@Model.GroupOptions[i].GroupName">
        @for (var j = 0; j < Model.GroupOptions[i].ConfigOptionTypes.Count; j++)
        {
            for (var k = 0; k < Model.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions.Count; k++)
            {
                if (Model.GroupOptions[i].ConfigOptionTypes[j].Type == ConfigOptionFieldType.String)
                {
                    <div class="control-group">
                        <label class="control-label">@Model.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions[k].Name</label>
                        <div class="controls">
                            @Html.TextBoxFor(m => m.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions[k].Value, new { @class = "m-wrap medium" })
                            <span class="help-block">@Model.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions[k].Tooltip</span>
                        </div>
                    </div>
                }
            }
        }
    </div>
}

当我发布表单时,我只会GroupOptions返回0。

当我检查回发的数据时,我可以看到:

GroupOptions:System.Collections.Generic.List`1[CC.Web.Areas.Administration.Models.ConfigOption.ConfigOptionGroupViewModel]
GroupOptions[0].ConfigOptionTypes[0].ConfigOptions[0].Value:SomeStr

基于.Value以正确的值回发的事实,我认为这足以绑定它。

有人可以解释我错过的内容吗?

注意:我尝试了尽可能多的变体,并试图为所有属性添加隐藏字段,但由于某种原因它仍然失败。

编辑这是传递给我视图的模型:

@model CC.Web.Areas.Administration.Models.ConfigOption.ConfigOptionsViewModel

这是我的帖子方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddEditStoreConfigOption(ConfigOptionsViewModel configOptionsViewModel)
{
    return RedirectToAction("Index");
}

configOptionsViewModel.GroupOptions.Count始终为0。

1 个答案:

答案 0 :(得分:1)

我怀疑问题是if声明。如果值为false,则不会呈现任何文本框,您将获得非连续的索引器。索引器必须从零开始,并且连续DefaultModelBinder绑定集合。要解决此问题,请添加else语句以呈现隐藏的输入

if (Model.GroupOptions[i].ConfigOptionTypes[j].Type == ConfigOptionFieldType.String)
{
  ....
  @Html.TextBoxFor(m => m.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions[k].Value, new { @class = "m-wrap medium" })
  ....
}
else
{
  @Html.HiddenFor(m => m.GroupOptions[i].ConfigOptionTypes[j].ConfigOptions[k].Value
}