Custom Model-Binder, который исходит из проблемы с файлами cookie?

Я пытаюсь сделать следующее.

Используйте привязку модели по умолчанию для привязки объекта из значений строки запроса.
Если это не удается, я пытаюсь привязать объект из значений файлов cookie.

Однако я использую аннотации данных для этого объекта, и у меня возникают следующие проблемы.

  1. Если параметры строки запроса отсутствуют, связыватель модели по умолчанию даже не регистрирует никаких ошибок проверки в обязательных полях. Очевидно, он даже не запускает эти валидаторы, если самого свойства нет в коллекции строк запроса. Как я могу изменить это поведение? Я бы хотел, чтобы обязательные поля были ошибками, если их нет в строке запроса.
  2. Если у меня есть ошибки проверки модели, я хотел бы затем загрузить модель из файла cookie, а затем повторно проверить объект. Я не уверен, как заставить привязку модели проверять объект, который я сам заселил.

Вот что у меня есть на данный момент.

    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;
    }
}

Любая помощь о том, как это сделать, будет принята с благодарностью.


person Jeff    schedule 04.02.2010    source источник
comment
Я вижу, что часть 1 моего вопроса решена новой версией asp.net mvc 2.   -  person Jeff    schedule 05.02.2010
comment
В основном интересует, как вручную выполнить проверку модели после загрузки объекта из cookie.   -  person Jeff    schedule 05.02.2010


Ответы (1)


Ну я сам решил. Размещение решения здесь на случай, если у кого-то есть комментарии или он может захотеть его использовать.

 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;
        }
    }
}
person Jeff    schedule 14.02.2010