asp.net MVC Auto-binds طراز تم تحديثه عندما يكون الطراز غير صالح على httppost

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

سؤال

أنا أعمل على تطبيق ASP.NET MVC2. لقد أدركت شيئًا مدهشًا للغاية ، ولكنه مذهل يفعله MVC وراء الكواليس التي تتعلق بـ ModelState وملزمة النموذج. لديّ ViewModel يحتوي على مجموعة كاملة من البيانات - بعض الحقول جزء من شكل بينما البعض الآخر ببساطة جزء من واجهة المستخدم. على HTTPPOST ، تستخدم طريقة الإجراء الخاصة بي DefaultModelBinder التي تحاول ربط النموذج بأكمله ، ولكن فقط الحقول التي كانت جزءًا من النموذج غير مرغوب فيها بنجاح - يظل جميع الآخرين لاغية. هذا جيد ومفهوم. إذا كانت النموذج غير صالحة ، فأنا بحاجة إلى ذلك تحديث النموذج من DB و ربط حقول النماذج المحددة هذه قبل العودة إلى نفس طريقة عرض التحرير لعرض أخطاء التحقق من صحة النموذج المرتبطة بها.

هنا يأتي دهشتي وفضولي. لقد كان افتراضي أنه من أجلني ربط حقول النموذج مع النموذج المنعش ، كنت بحاجة لإجراء مكالمة إلى أي منهما UpdateModel() أو TryUpdateModel<>(), ، تمرير في النموذج الذي تم تحديثه حديثًا. فمثلا:

[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
    if (model.IsValid)
    {
        // Save the results to the db

        return RedirectToAction(...)
    }

    // Can't simply "return View(model)". Not all fields in EditDetailItemModel
    // were part of the form - thus they returned null. Have to refresh
    // model from the db.

    var refreshedModel = RefreshModelFromDB();

    // Is this line necessary?????
    TryUpdateModel<EditDetailItemModel>(refreshedModel);

    return View(refreshedModel);
}

لكن ما وجدته هو أنه إذا عدت ببساطة refreshedModel إلى العرض دون إجراء مكالمة إلى TryUpdateModel<>(), تم ربط النموذج الذي تم تحديثه تلقائيًا بقيم حقل النموذج المنشورة!! وبالتالي ، و TryUpdateModel<>() ليس هناك حاجة هنا!

الطريقة الوحيدة التي يمكنني من خلالها فهم أي معنى هي أنه نظرًا لأن مجموعة الطرازات في حالة غير صالحة ، بمجرد إرجاع العرض مع النموذج المنعش ، فإن "محرك عرض MVC" محاط من خلال أخطاء النموذج وربط قيم الخصائص هذه مع بلدي المنعشة نموذج. هذا ببساطة رائع! لكنني أريد دليلًا على هذا الافتراض. لا يمكنني العثور على وثائق بخصوص هذا في أي مكان على الويب. هل يمكن لأي شخص إما أن يؤكد فرضيتي عن السبب/كيف يحدث هذا السلوك الرائع التلقائي الرائع و/أو يعلمني عن سبب/كيف يحدث ذلك ، ونأمل أن يكون نسخة احتياطية من بعض روابط التوثيق عبر الإنترنت ، لذا فهمت بشكل كامل ما يجري تحت الأغطية؟

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

المحلول

public ActionResult EditDetail(EditDetailItemModel model)

هذا الخط سيؤدي الربط النموذج. فكر في معلمات ActionMethod كما هو الحال دائمًا في ملء مكالمة إلى updateModel.

أنت لا تشاهد قيم RefreshedModel في العرض ، فأنت ترى إدخالات وقيم النموذج من EditDetailitemModel.

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