سؤال

هذه المشكلة كانت تقودني مجنون لعدة ساعات الآن ...

في نطاقي، لدي كيانات مرتبطة ببعضها البعض 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}", 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 يمكن إزالة المعلمة على طريقة وحدة التحكم الخاصة بي. لماذا لا يعمل هذا؟

هل كانت مفيدة؟

المحلول

قد تحتاج إلى إنشاء Binder نموذج مخصص لهذا؟

نصائح أخرى

نأمل أن أفهمك مشكلة بشكل صحيح ...

بدلا من تحديد الخاص بك يحفظ الإجراء مع 2 معلمات، هل حاولت فقط تحديده مع معلمة واحدة، من النوع سك.?

يمكنك بعد ذلك إعادة تعريف عناصر تحكم HTML العنصر المشابهة للمثال التالي ...

<%=
    Html.TextBox
    (
        string.Format("sku.Items[{0}].{1}", i, "ItemId"), 
        Model.Items[i].ItemId, 
        new { @readonly = "readonly", onfocus = "this.blur();" }
    )
%>


بهذه الطريقة، أنت ملء العناصر مباشرة في كائن SKU نفسه.


سيكون الحل المحتمل آخر هو إضافة حقل إضافي إلى فئة البند الخاصة بك، مثل ...

Int32 SkuId { get; set; }

بهذه الطريقة، يمكنك تحديد حقل مخفي إضافي لكل عنصر في رأيك الذي سيكون مرتبك تلقائيا مع Skuid من كل عنصر مرة أخرى في وحدة التحكم.

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

يمكنك بعد ذلك تحديث مجموعة البنود الخاصة بك بشكل مستقل عن كائن SKU الخاص بك. بغض النظر عن الطريقة التي تذهب بها، يتعين على المجموعتين أن تخبر Linq بصراحة عن SQL لتحديث SKU والعناصر على أي حال.

يمكنك أيضا تحديد فئة الموثق الخاصة بك، ولكن هذا هو أكثر عمل أكثر مما يستحق في هذه الحالة. ما عليك سوى اتباع اتفاقيات ASP.NET MVC، وأعتقد أنك يجب أن تكون قادرا على العثور على شيء سيعمل دون الشعور بهذا اختراق.

كان لدي مشكلة مماثلة حيث لم تكن الكفراء ملزمة بشكل صحيح في رأيي.

ما فعلته هو إنشاء خاصية أخرى تسمى MVC [yourentitysetpropertyname]، كقائمة عامة، التي ملفوفة حول الحقول الخاصة من الكمال:

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

ثم استخدمت ذلك بدلا من خاصية Entityset على طريقة العرض الخاصة بي.

لن تكون هناك حاجة لتمرير العناصر في توقيع طريقة وحدة التحكم الخاصة بك - فقط اجتياز SKU في تلك المرحلة:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(Sku sku)
{
    if (sku != null)
    {
       // save Sku to repository ...
       // return Details view ...
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top