نموذج مخصص نموذج يسحب من مشكلة ملفات تعريف الارتباط؟

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

سؤال

أحاول القيام بما يلي.

استخدم Binder النموذج الافتراضي لربط كائن من قيم سلسلة الاستعلام.
إذا فشل ذلك، فأنا أحاول ثم ربط الكائن من قيم ملفات تعريف الارتباط.

ومع ذلك، فأنا أستخدم البيانات الخاصة بهذا الكائن وأواجه المشكلات التالية.

  1. إذا لم تكن هناك معلمات Querystring، فلن يقوم Binder النموذج الافتراضي بتسجيل أي أخطاء صحيحة في الحقول المطلوبة. يبدو أنه لا يطلق حتى تسرب هذه الموصلات إذا لم يكن العقار نفسه في مجموعة سلسلة الاستعلام. كيف يمكنني تغيير هذا السلوك؟ أرغب في أن تكون الحقول المطلوبة أخطاء إذا لم تكن في سلسلة الاستعلام.
  2. إذا كان لدي أخطاء صحة نموذجية، أود ذلك بعد ذلك تحميل النموذج من ملف تعريف الارتباط ثم revidateate الكائن. لست متأكدا من كيفية الحصول على نموذج Binder للتحقق من صحة كائن قمت بسكت نفسي.

هنا ما لدي حتى الآن.

    public class MyCarBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var myCar = base.BindModel(controllerContext, bindingContext);

        if (!bindingContext.ModelState.IsValid)
        {
            myCar = MyCar.LoadFromCookie();
            // Not sure what to do to revalidate
        }

        return myCar;
    }
}

أي مساعدة حول كيفية القيام بذلك بشكل صحيح سيكون موضع تقدير كبير.

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

المحلول

حسنا، أنا حلها بنفسي. نشر الحل هنا في حالة وجود أي شخص لديه تعليقات أو قد ترغب في استخدامه.

 public class MyCarBinder : DefaultModelBinder
 {
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var queryStringBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new QueryStringValueProvider(controllerContext),
            ModelState = new ModelStateDictionary()
        };

        var myCar = base.BindModel(controllerContext, queryStringBindingContext);

        if (queryStringBindingContext.ModelState.IsValid)
            return myCar;

        // try to bind from cookie if query string is invalid
        var cookieHelper = new Helpers.ControllerContextCookieHelper(controllerContext);
        NameValueCollection nvc = cookieHelper.GetCookies(Helpers.CookieName.MyCar);

        if (nvc == null)
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }

        var cookieBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new NameValueCollectionValueProvider(nvc, CultureInfo.InvariantCulture),
            ModelState = new ModelStateDictionary()
        };

        var myCarFromCookie = base.BindModel(controllerContext, cookieBindingContext);

        if (cookieBindingContext.ModelState.IsValid)
        {
            MyCar temp = myCarFromCookie as MyCar;
            if (temp != null)
                temp.FromCookie = true;

            return myCarFromCookie;
        }
        else
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top