Asp.net mvc ASP.NET MVC模型在同一页面上绑定相关实体

Asp.net mvc ASP.NET MVC模型在同一页面上绑定相关实体,asp.net-mvc,linq,data-binding,model-binding,entityset,Asp.net Mvc,Linq,Data Binding,Model Binding,Entityset,这个问题已经让我发疯好几个小时了 在我的域中,我有两个相互关联的实体Sku和Item。每个sku可以有许多项 public class Sku { private readonly EntitySet<Item> items; public Sku() { items = new EntitySet<Item>(AttachItems, DetachItems); } public int SkuId { get;

这个问题已经让我发疯好几个小时了

在我的域中,我有两个相互关联的实体
Sku
Item
。每个sku可以有许多项

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; }
}

这是可行的,但是我注意到,除了对
Sku
进行一次行程外,它还对每个
项目通过
DefaultModelBinder
进行两次行程。当绑定
Sku
时,调用
项目的setter
,活页夹甚至会以正确的值传入水合
项目
集合。但是,在调用
items.Assign
之后,
items.Count
0
。这就是为什么我必须重新分配控制器代码中的项目。我希望活页夹将项目转移到
items
集合中。这将消除每个项目的额外行程,因为我的控制器方法上的
items
参数可以删除。为什么不起作用?

您可能需要为此创建一个自定义模型绑定器?

希望我能正确理解您的问题

与其用两个参数定义保存操作,您是否尝试过用一个Sku类型的参数来定义它

然后,您可能希望重新定义与以下示例类似的项目HTML控件

<%=
    Html.TextBox
    (
        string.Format("sku.Items[{0}].{1}", i, "ItemId"), 
        Model.Items[i].ItemId, 
        new { @readonly = "readonly", onfocus = "this.blur();" }
    )
%>
通过这种方式,您可以为视图中的每个项目定义一个额外的隐藏字段,该字段将自动绑定到控制器中每个项目的SkuId

<%=
    Html.Hidden
    (
        string.Format("sku.Items[{0}].{1}", i, "SkuId"), 
        Model.Items[i].SkuId
    )
%>

然后,您可以独立于Sku对象更新项目集合。无论您选择哪种方式,这两个集合都必须明确地告诉Linq to SQL以更新sku和条目


您也可以定义自己的活页夹类,但在本例中,这可能需要做更多的工作。只要遵循ASP.NET MVC约定,我认为您应该能够找到一些可以正常工作的东西,而不会觉得这是一个黑客行为。

我遇到了一个类似的问题,EntitySet在我的ViewModel中没有正确绑定

我所做的是创建另一个名为Mvc[YourEntitySetPropertyName]的属性,作为一个通用列表,它围绕EntitySet的私有字段:

public List<InvoiceLineItem> MvcInvoiceLineItemList
    {
        get { return _invoiceLineItemList.ToList(); }
        set { _invoiceLineItemList.AddRange(value); }
    }

我不确定我是否理解你的问题所在,但请查看这篇文章,更重要的是,查看Phil Haack的评论,我最终使用了定制活页夹。
Int32 SkuId { get; set; }
<%=
    Html.Hidden
    (
        string.Format("sku.Items[{0}].{1}", i, "SkuId"), 
        Model.Items[i].SkuId
    )
%>
public List<InvoiceLineItem> MvcInvoiceLineItemList
    {
        get { return _invoiceLineItemList.ToList(); }
        set { _invoiceLineItemList.AddRange(value); }
    }
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(Sku sku)
{
    if (sku != null)
    {
       // save Sku to repository ...
       // return Details view ...
    }

}