ربط السمة تشمل واستبعاد الممتلكات مع الكائنات المتداخلة نوع معقدة

StackOverflow https://stackoverflow.com/questions/8892550

سؤال

حسنا ، هذا غريب.لا أستطيع استخدام BindAttributeفي Include و Exclude خصائص مع كائنات متداخلة من النوع المعقد على ASP.NET مفك.

هنا هو ما فعلته:

نموذج:

public class FooViewModel {

    public Enquiry Enquiry { get; set; }
}

public class Enquiry {

    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

المتشعب وظيفة العمل:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "Enquiry.EnquiryId")]
    FooViewModel foo) {

    return View(foo);
}

عرض:

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.Enquiry.EnquiryId)
    @Html.TextBoxFor(m => m.Enquiry.Latitude)

    <input type="submit" value="push" />
}

لا يعمل على الإطلاق.هل يمكنني فقط جعل هذا العمل إذا حددت BindAttribute ل Enquiry الطبقة كما هو مذكور هنا:

كيف يمكنني استخدام [ربط(تشمل="")] السمة على الكائنات المتداخلة المعقدة?

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

المحلول

نعم ، يمكنك جعلها تعمل على هذا النحو:

[Bind(Include = "EnquiryId")]
public class Enquiry 
{
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

والعمل الخاص بك:

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(FooViewModel foo) 
{
    return View(foo);
}

وسيشمل ذلك فقط EnquiryId في ملزمة وترك Latitude لا شيء.

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

لذلك ببساطة أعد تكييف نماذج العرض الخاصة بك:

public class FooViewModel 
{
    public EnquiryViewModel Enquiry { get; set; }
}

public class EnquiryViewModel 
{
    public int EnquiryId { get; set; }
}

ها أنت ذا.لم تعد بحاجة للقلق بشأن الربط.

نصائح أخرى

إمهو هناك طريقة أفضل للقيام بذلك.

أساسا إذا كان لديك نماذج متعددة في نموذج العرض توقيع وحدة تحكم آخر سوف تحتوي على نفس النماذج ، بدلا من نموذج العرض.

آي إي.

public class FooViewModel {
    public Bar BarV { get; set; }
    public Enquiry EnquiryV { get; set; }
    public int ThisNumber { get; set; }
}

public class Bar {
    public int BarId { get; set; }
}

public class Enquiry {
    public int EnquiryId { get; set; }
    public string Latitude { get; set; }
}

وعمل آخر في وحدة تحكم سوف تبدو مثل هذا.

[ActionName("Foo"), HttpPost]
public ActionResult Foo_post(
    [Bind(Include = "EnquiryId")]
    Enquiry EnquiryV,
    [Bind(Include = "BarId"])]
    Bar BarV,
    int ThisNumber
{
    return View(new FooViewModel { Bar = BarV, Enquiry = EnquiryV, ThisNumber = ThisNumber });
}

كل ذلك بينما لا يزال المنظر يبدو كما يلي

@using (Html.BeginForm()) {

    @Html.TextBoxFor(m => m.EnquiryV.EnquiryId)
    @Html.TextBoxFor(m => m.EnquiryV.Latitude)
    @Html.TextBoxFor(m => m.BarV.BarId)
    @Html.TextBoxFor(m => m.ThisNumber)

    <input type="submit" value="push" />
}

ضع في اعتبارك أن هذا النموذج سيظل ينشر خط العرض مرة أخرى (الطريقة التي قمت بإعداده بها) ، ولكن نظرا لأنه لم يتم تضمينه في سلسلة تضمين الربط للاستفسار عن إجراء النشر ، فلن يقبل الإجراء القيمة الجديدة في الاستفسار الناتج.أود أن أقترح جعل خط العرض إما معطلا أو ليس عنصر نموذج لمنع نشر بيانات إضافية.

في أي سيناريو آخر يمكنك استخدام ربط على ما يرام ، ولكن لسبب ما يكره تدوين نقطة للنماذج المعقدة.

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

(قمت بتعديل أسماء المتغيرات لبعض الوضوح.كما أنني أدرك أن سؤالك مؤرخ إلى حد ما, ولكن في البحث عن الإجابة بنفسي ، هذا هو الأول ، لذا عثرت عليه قبل تجربة الحلول الخاصة بي والوصول إلى الحل الذي نشرته.آمل أن يساعد الأشخاص الآخرين الذين يبحثون عن حل لنفس المشكلة.)

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