我無法理解asp.net mvc模型綁定器如何工作。asp.net mvc modelbinding不綁定集合
模式
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>
爲什麼要默認的模型綁定填充模型上的詳細屬性?爲什麼我必須將其作爲單獨的參數包含在控制器中?
我已經閱讀了關於asp和綁定到列表的多篇文章,其中包括在其他問題中被多次引用的Haackeds。這是SO上的this thread,導致我選擇了[Binding(Prefix...)]
選項。它說'模型可能太複雜了',但是對於默認的模型綁定器來說,究竟是「太複雜」了嗎?
你看過可能創建自己的模型粘合劑嗎?下面是定製模型綁定器的一個很好的參考:[從MSDN雜誌](http://msdn.microsoft.com/en-us/magazine/hh781022.aspx) – jacqijvv
不,我已經看到了可能性,但我更多好奇的爲什麼asp不能通過它自己來解決這個案例... – Vegar
你應該看看這個舊的[post](http://haacked.com/archive/2008/10/23/model-binding-to -a-list.aspx /)Phil Haack,他很清楚地解釋了什麼使得一個類型複雜的綁定。但總而言之,動態地(MVC的DefaultModelBinder)確定Request對象中的** id **和** title **的「隨機」集合幾乎不可能實際上是集合的一部分,而不使用索引。 – jacqijvv