加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 同一页面上的ASP.NET MVC模型绑定相关实体

发布时间:2020-12-16 03:18:30 所属栏目:asp.Net 来源:网络整理
导读:这个问题让我疯了好几个小时了…… 在我的域中,我有2个与Sku和Item相关的实体.每个sku可以有很多项目. public class Sku{ private readonly EntitySetItem items; public Sku() { items = new EntitySetItem(AttachItems,DetachItems); } public int SkuId {
这个问题让我疯了好几个小时了……

在我的域中,我有2个与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上的某些字段和每个项目的某些字段.

<% 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}","Category"),Model.Items[i].Category)%></p>
    <p><label for="Description">Description:</label>
       <%= Html.TextBox(string.Format("items[{0}].{1}","Description"),Model.Items[i].Description)%></p>
</fieldset>
<%} // for-loop %>
    <p><input type="submit" value="Save" /></p>
<%} // form %>

我有一些控制器代码,通过接受项目的Sku和EntitySet,然后将项目分配给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 ...
    }

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读