2010-02-04 7 views
2

Я пытаюсь сделать следующее.Пользовательская модель-Binder, которая тянет из проблемы с файлом cookie?

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

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

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

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

+0

Я вижу часть 1 мой вопрос решается новой версии ASP.NET MVC 2. – Jeff

+0

в основном заинтересованы в том, как вручную сделать проверку модели после загрузки объекта из печенья. – Jeff

ответ

5

Ну, я решил это сам. Публикация решения здесь, если у кого-то есть комментарии или они могут его использовать.

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