سؤال

يحرر - نحن نستخدم 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
{
    //...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top