我有以下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。
答案 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
}