هل تريد إعادة التحقق من ViewModel المعدل ضمن طريقة التحكم؟
-
27-10-2019 - |
سؤال
يحرر - نحن نستخدم MVC4 Dev Preview....
أقوم بتنفيذ صفحة تحرير لـ a FishingTrip
فصل. FishingTrip
يحتوي على مجموعة الطفل بسيطة Crew
الكائنات (أيFishingTripID، CrewID، CrewPosition).
أنا استخدم نهج جاريت ماير للإضافة والتعديل والحذف من Crew
مجموعة.أنا أستخدم التحقق غير المزعج لتحديد خصائص Crew
الجميع Required
.
مشكلتي:عندما أقوم بحذف عنصر من القائمة بشكل منطقي (وفقًا لطريقة جاريت)، لا أريد التحقق من صحة هذا العنصر.
لقد نجحت في تعديل طريقة "removeRow" من جانب العميل لتعطيل التحقق غير المزعج للعنصر المحذوف منطقيًا، بحيث يتم نشر النموذج على الرغم من وجود عنصر يحتوي على حقول فارغة.
في طريقة التحكم الخاصة بي [HttpPost] Edit
, ModelState.IsValid
يبدأ كخطأ (كما هو متوقع - بسبب العنصر المحذوف منطقيًا والذي يحتوي على حقول فارغة.) لذلك أقوم بإزالة هذا العنصر من ViewModel الخاص بي....لكن ModelState.IsValid
لا يزال كاذبا.
باختصار، (أعتقد أنني) أريد تعديل ViewModel الخاص بي ضمن طريقة التحكم لإزالة العنصر المخالف، ثم استدعاء نوع من "إعادة التحقق"، والحصول على ModelState.IsValid
تظهر على أنها صحيحة.
أيه أفكار؟
المحلول
بمجرد قيامك بإزالة العنصر (العناصر) المخالفة، قم بمسح ModelState والتحقق من صحته مرة أخرى، كما يلي:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
ملحوظة:كن حذرا عند الاستخدام TryValidateModel
الطريقة لأن هذه الطريقة لا تتحقق من صحة كائن النموذج المتداخل (كما ذكرMerenzo).
نصائح أخرى
متأخرا عن المباراة، ولكن لا يزال:كنت أبحث أيضًا عن طريقة للتحقق من صحة النموذج بعد إجراء بعض التعديلات عليها (بتعبير أدق - على عناصر مجموعتها المتداخلة) - و TryValidateModel
لم يعمل معي، لأنه لا يعالج الكائنات المتداخلة.
أخيرًا، استقريت على رابط النموذج المخصص:
public class MyItemModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyItemModel))
{
MyItemModel item = (MyItemModel)bindingContext.Model;
//do required tweaks on model here
//(I needed to load some additional data from DB)
}
//validation code will be called here, in OnModelUpdated implementation
base.OnModelUpdated(controllerContext, bindingContext);
}
}
على فئة النموذج:
[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
//...
}