Эта проблема была сводит меня с ума в течение нескольких часов теперь ...ASP.NET MVC модель привязки связанных сущностей на той же странице
В моем домене, у меня есть 2 сущностей, которые связаны друг с другом и Sku
Item
. У каждого ску может быть много предметов.
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; }
}
Я строю страницу, которая позволит конечному пользователю обновить некоторые поля на идентификатор и некоторые поля на каждой позиции одновременно.
<% 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
из Item
, а затем назначая Items
к 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
для каждого Item
в дополнение к одной поездке на Sku
. Когда связывается Sku
, вызывается установщик для Items
, и связующее даже проходит в гидратированной коллекции Items
с правильными значениями. Однако после звонка по номеру items.Assign
, Items.Count
- 0
. Вот почему мне приходится повторно назначать элементы в коде контроллера. Я ожидал, что предметы будут переданы в сборку Items
связующим. Это должно устранить дополнительную поездку за элемент, поскольку параметр items
на моем методе контроллера можно удалить. Почему это не работает?
Я не уверен, если я понимаю, что это ваша проблема, но проверить эту статью и, что более важно, комментарии, от Фила Хака http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx –