我很难理解asp.net mvc模型绑定器是如何工作的。
型号
public class Detail
{
public Guid Id { get; set; }
public string Title {get; set; }
}
public class Master
{
public Guid Id { get; set;}
public string Title { get; set; }
public List<Detail> Details { get; set; }
}
字符串
查看
<!-- part of master view in ~/Views/Master/EditMaster.cshtml -->
@model Master
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.Id)
@Html.TextBoxFor(m => m.Title)
@Html.EditorFor(m => m.Details)
<!-- snip -->
}
<!-- detail view in ~/Views/Master/EditorTemplates/Detail.cshtml -->
@model Detail
@Html.HiddenFor(m => m.Id)
@Html.EditorFor(m => m.Title)
型
控制器
// Alternative 1 - the one that does not work
public ActionResult Save(Master master)
{
// master.Details not populated!
}
// Alternative 2 - one that do work
public ActionResult Save(Master master, [Bind(Prefix="Details")]IEnumerable<Detail> details)
{
// master.Details still not populated, but details parameter is.
}
型
渲染html
<form action="..." method="post">
<input type="hidden" name="Id" value="....">
<input type="text" name="Title" value="master title">
<input type="hidden" name="Details[0].Id" value="....">
<input type="text" name="Details[0].Title value="detail title">
<input type="hidden" name="Details[1].Id" value="....">
<input type="text" name="Details[1].Title value="detail title">
<input type="hidden" name="Details[2].Id" value="....">
<input type="text" name="Details[2].Title value="detail title">
<input type="submit">
</form>
型
为什么要使用默认的模型绑定器填充模型上的Details-property?为什么我必须将它作为控制器的一个单独参数包含进来?
我读过多篇关于asp和绑定到列表的文章,包括在其他问题中多次提到的Haackeds。正是SO上的this thread将我引导到[Binding(Prefix...)]
选项。它说“模型可能太复杂了”,但是对于默认的模型绑定器来说,到底什么是“太复杂”?
2条答案
按热度按时间dxpyg8gm1#
你的问题中的模型并不“太复杂”。但是,复杂类型的列表(如Details对象)将是复杂绑定。
对于复杂的绑定,使用编辑器模板。此editorTemplate指定如何呈现复杂类型的编辑器。正在视图所在文件夹的“EditorTemplates”文件夹中搜索EditorTemplates。默认情况下,编辑器模板必须具有复杂类型类的名称。因此,在这种情况下,应该将其命名为Detail.cshtml
在你的编辑器模板中,你可以使用类似这样的东西:
字符串
现在,当你在你的正则模型中调用
@Html.EditorFor(m => m.Details)
时,对于Details列表中的每一项,指定的编辑器模板都会被渲染。在操作指向的控制器中,您可以只要求您的Model的示例,如:
型
现在,在保存方法中,
model.Details
将被视图中的数据填充。请注意,MVC只会将表单中可用的数据返回到控制器。所有未呈现或不在表单中的数据都不会返回。
h7appiyu2#
如果使用 AJAX 发送数据,请确保请求Content-Type头设置为application/x-www-form-urlencoded,而不是其他类型,如application/json。