【发布时间】:2013-07-12 13:07:59
【问题描述】:
我有一个名为CategoryModel 的类,其中一个属性是相同类型对象的列表。所以CategoryModel.Categories 的类型是List<CategoryModel>。
在类别索引页面上,我为每个类别显示了一个编辑器,以便用户可以更改任何类别名称,而无需转到专用页面。像这样:
<ul id="categories>
@Html.EditorFor(model => model.Categories)
</ul>
CategoryModel 的编辑器模板如下所示:
<li class="folder">
@using (Html.BeginForm("Edit", "Category", new { id = Model.Key }, FormMethod.Post, new { @class = "ajaxoff"})) {
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Key)
@Html.HiddenFor(model => model.ParentKey)
@Html.HiddenFor(model => model.Sequence)
@Html.HiddenFor(model => model.IncludeDeleted)
@Html.TextBoxFor(model => model.Name, null, new { @class = "catName" })
@Html.ValidationMessageFor(model => model.Name)
<input type="submit" value="Save" class="icon save" />
}
</li>
我遇到的问题是提交表单没有正确绑定到CategoryController 的Edit 操作:
[HttpPost]
public ActionResult Edit(CategoryModel category)
{
// At this point all properties in category are null
}
如果我检查隐藏字段和文本框上的名称,它们会根据它们在当前类别中的位置进行标记(例如Categories[0].Name)。但是,如果我创建一个专用的编辑视图,它们只是根据字段名称命名(例如Name)。
我已尝试更改控制器以接受类别列表:
[HttpPost]
public ActionResult Edit(List<CategoryModel> categories)
{
var category = categories.First();
}
如果我提交第一个类别,但其他类别均不提交(在这些情况下,Categories 为空),则此方法有效。
我还尝试通过这样做来更改我的 EditorFor 的显示方式:
<ul id="categories>
@foreach (var cat in Model.Categories)
{
@Html.EditorFor(model => cat);
}
</ul>
这会将每个类别的字段名称更改为相同(例如,所有类别名称都称为cat.Name),我认为这是朝着正确方向迈出的一步。
那么如何正确绑定到我的控制器?我意识到我可以提交整个父类别,然后保存每个子类别,但这似乎是提交单个更改的一种非常低效的方式。
【问题讨论】:
标签: c# asp.net-mvc razor model-binding