ربط السمة تشمل واستبعاد الممتلكات مع الكائنات المتداخلة نوع معقدة
-
29-10-2019 - |
سؤال
حسنا ، هذا غريب.لا أستطيع استخدام 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" />
}
ضع في اعتبارك أن هذا النموذج سيظل ينشر خط العرض مرة أخرى (الطريقة التي قمت بإعداده بها) ، ولكن نظرا لأنه لم يتم تضمينه في سلسلة تضمين الربط للاستفسار عن إجراء النشر ، فلن يقبل الإجراء القيمة الجديدة في الاستفسار الناتج.أود أن أقترح جعل خط العرض إما معطلا أو ليس عنصر نموذج لمنع نشر بيانات إضافية.
في أي سيناريو آخر يمكنك استخدام ربط على ما يرام ، ولكن لسبب ما يكره تدوين نقطة للنماذج المعقدة.
كملاحظة جانبية ، لن أضع سمة الربط على الفصل مباشرة لأنها يمكن أن تسبب مشكلات أخرى مثل تكرار الكود ، ولا تأخذ في الاعتبار سيناريوهات معينة حيث قد ترغب في الحصول على ارتباط مختلف.
(قمت بتعديل أسماء المتغيرات لبعض الوضوح.كما أنني أدرك أن سؤالك مؤرخ إلى حد ما, ولكن في البحث عن الإجابة بنفسي ، هذا هو الأول ، لذا عثرت عليه قبل تجربة الحلول الخاصة بي والوصول إلى الحل الذي نشرته.آمل أن يساعد الأشخاص الآخرين الذين يبحثون عن حل لنفس المشكلة.)