ما هو النمط الصحيح للحماية من NullReferenceExceptions في ASP.NET MVC
-
27-09-2019 - |
سؤال
تحديث كانت القضية مشكلة بناء الجملة. يعرض Awrigley الطريقة الصحيحة لكتابة هذا في Razor.
الأعمال التالية:
@if(Model.Thing.Prop != null)
{
Html.RenderPartial("SomePartialView", Model.Thing.Prop);
}
لديك شرط لإظهار التفاصيل لأعلى 1 Foo
لاجل منحه Bar
كجدول HTML. كيف تخفي الجدول الفارغ أو إظهار رسالة "لا شيء" إذا كان ذلك Foo
باطل؟
فمثلا. أنا أحصل على NullReferenceException
على السطر التالي بسبب Model.Thing.Prop
هو null
;
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
إنه فارغ عن قصد ، يعود مستودعي الفارغ بدلاً من فارغة Foo
. ولكن هذا هو معتدل إلى جانب النقطة ، وهو ما يعطى فارغا Model.Thing.Prop
, ، لا أريد الاتصال Html.RenderPartial
.
تحديث
لقد جربت ما يلي بدون حظ:
@if(Model.Thing.Prop != null)
{
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
}
مما يؤدي إلى إخباري في الاستوديو البصري بأنه يتوقع ;
في السطر 1 ، العمود 1 وكذلك ذلك ;
هو تعبير غير صالح في السطر 1 ، العمود 1 (أعتقد أن هذا يرجع إلى حالة ما قبل الإصدار من MVC3) ، وإذا وصلت إلى الصفحة في متصفح أحصل عليه
CS1501: لا يوجد تحميل زائد للطريقة "الكتابة" يأخذ 0 وسيطات
مع ال @Html.RenderPartial
خط تسليط الضوء.
لقد حاولت أيضا
@if(Model.Thing.Prop != null)
{
<text>
@{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
</text>
}
لكن هذا ينتج عنه NullReferenceException
من داخل وجهة نظري الجزئية ، والتي لا تبدو صحيحة. Model.Thing
بالتأكيد صالح Bar
و Model.Thing.Prop
هو بالتأكيد أ null
Foo
.
المحلول
أفترض أنك لا تريد استخدام ...
@if (Model.Thing.Prop != null)
{Html.RenderPartial("SomePartialView", Model.Thing.Prop);}
... لأنك لا تزال ترغب في تقديم جزء من العرض الجزئي؟
أوه ، لا. لقد قرأت رسالتك بشكل صحيح.
ليس لدي أي فكرة لماذا لا يعمل الرمز أعلاه من أجلك.
تعديل:
تذكر أنه في الحلاقة ، يمكن استخدام @ طريقتين:
لتنفيذ البيانات:
@{ بياني؛ }
لتقييم htmlhelper ، طريقة فئة أو خاصية أو متغير يرجع سلسلة من شكل أو آخر (على سبيل المثال ، htmlstring ، mvchtmlstring أو سلسلة). فمثلا:
@myClass.MyStringProperty
لاحظ أنه في الحالة 2 ، لا يلزم إنهاء نصف القولون.
تشير 1 و 2 إلى أنه إذا كان لديك htmlhelper يرجع شيئًا آخر غير سلسلة (على سبيل المثال ، باطلة) ، فعليك أن تسميها على النحو التالي:
@{Html.MyHelperThatReturnsVoid;}
بينما مع htmlhelper الذي يرجع سلسلة أو htmlstring أو mvchtmlstring ، يمكنك ببساطة الكتابة:
@Html.MyHelperThatReturnsAString
لمزيد من التفاصيل ، انظر إجابة مقبولة لسؤال طرحته:
HTMLHelper مخصص الذي يعيد مشكلة الفراغ
نصائح أخرى
هذا إما تغيير في MVC3 أو شيء غريب.
سلوك MVC2:
إذا كان النموذج.
في حالة وجود نموذج. عندما تمرر مرجعًا فارغًا إلى النموذج ، يتم تمرير النموذج الأصل (النموذج هنا) كنموذج إلى "SomePartialView" الذي يتوقع دعامة النوع (ما لم تكن النموذج والدعامة نفس النوع).
بالنظر إلى أنك تحصل على Null Ref ، سأفترض أن هذا النموذج. في هذه الحالة ، سيكون الحل الوحيد الخاص بك عبارة عن بيان ef. تمرير Null إلى نموذج المرجع ببساطة لا يعمل وقد مزقت بعض الشعر على السلوك.
مرة أخرى ، هذا هو سلوك MVC2 ، إذا كان هذا قد تغير بالنسبة لـ MVC3 حيث يمكنك بصراحة تمرير نموذج فارغ ، رائع!