ASP.NET MVC模型绑定相同的实体在同一页 [英] ASP.NET MVC Model Binding Related Entities on Same Page
问题描述
这个问题一直让我疯狂了几个小时...
This problem has been driving me crazy for several hours now...
在我的域中,我有2个相互关联的实体 Sku
和项目
。每个sku可以有很多项目。
In my domain, I have 2 entities that are related to each other Sku
and Item
. Each sku can have many items.
public class Sku
{
private readonly EntitySet<Item> items;
public Sku()
{
items = new EntitySet<Item>(AttachItems, DetachItems);
}
public int SkuId { get; set; }
public string LongDescription { get; set; }
public EntitySet<Item> Items
{
get { return items; }
set{ items.Assign(value);}
}
private void AttachItems(Item entity)
{
entity.Sku = this;
}
private static void DetachItems(Item entity)
{
entity.Sku = null;
}
}
public class Item
{
public Sku Sku { get; set; }
public int ItemId { get; set; }
public string Category { get; set; }
public string Description { get; set; }
}
我正在构建一个页面,允许最终用户更新一些
I am building a page that will allow the end-user to update some fields on the sku and some fields on each item at the same time.
<% using (Html.BeginForm("Save", "Merchant", FormMethod.Post,
new { enctype = "multipart/form-data" })) { %>
<fieldset>
<legend>Sku</legend>
<p><label for="SkuId">SkuId:</label>
<%= Html.TextBox("SkuId", Model.SkuId,
new{@readonly="readonly",onfocus="this.blur();"}) %></p>
<p><label for="LongDescription">LongDescription:</label>
<%= Html.TextBox("LongDescription", Model.LongDescription) %></p>
</fieldset>
<% for (int i = 0; i < Model.Items.Count; i++) { %>
<fieldset>
<legend>Item</legend>
<p><label for="ItemId">ItemId:</label>
<%= Html.TextBox(string.Format("items[{0}].{1}", i, "ItemId"),
Model.Items[i].ItemId,
new { @readonly = "readonly", onfocus = "this.blur();" })%></p>
<p><label for="Category">Category:</label>
<%= Html.TextBox(string.Format("items[{0}].{1}", i, "Category"),
Model.Items[i].Category)%></p>
<p><label for="Description">Description:</label>
<%= Html.TextBox(string.Format("items[{0}].{1}", i, "Description"),
Model.Items[i].Description)%></p>
</fieldset>
<%} // for-loop %>
<p><input type="submit" value="Save" /></p>
<%} // form %>
我有一些控制器代码,通过接受 Sku
和 EntitySet
项目
,然后分配项目
到 Sku
。
I have some controller code that works by accepting both a Sku
and an EntitySet
of Item
and then assigning the Items
to the Sku
.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(Sku sku, EntitySet<Item> items)
{
if (sku != null)
{
if (items != null)
{
sku.Items.Assign(items);
}
}
// save Sku to repository ...
// return Details view ...
}
但是,我注意到,通过 DefaultModelBinder
每个项目
除了 Sku
之外的一次旅行。当 Sku
被绑定时,调用项目
的设置器,粘合剂甚至通过水合项目
集合与正确的值。但是,在调用 items.Assign
之后, Items.Count
是 0
。这就是为什么我必须重新分配控制器代码中的项目。我期待的项目被转移到绑定工具的项目
集合。这样可以消除每个项目额外的行程,因为我的控制器方法上的项目
参数可以被删除。为什么这不工作?
This works, however I have noticed that it makes two trips through the DefaultModelBinder
for each Item
in addition to one trip for the Sku
. When the Sku
is bound, the setter for Items
is called, and the binder even passes in a hydrated Items
collection with the correct values. However, after the call to items.Assign
, Items.Count
is 0
. This is why I have to re-assign the items in the controller code. I was expecting the items to be transferred over to the Items
collection by the binder. This should eliminate the extra trip per item, since the items
parameter on my controller method could be removed. Why isn’t this working?
推荐答案
您可能需要为此创建自定义模型binder?
You might need to create a custom model binder for this?
这篇关于ASP.NET MVC模型绑定相同的实体在同一页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!