2012-01-25 1 views
1

Я реализую стратегию обработки ошибок в приложении ASP.Net MVC 3. Я написал атрибут, реализующий IExceptionFilter и т. Д. Это правильно работает, обрабатывая исключения, бросая в метод действия и возвращает информацию об исключении, сериализованную как JSON.Формирование поведения UpdateModel из ASP.NET MVC 3 Метод привязки модели по умолчанию для параметра метода

Я хотел бы использовать этот атрибут, чтобы обрабатывать ошибки проверки, найденные связующим веществом модели при передаче данных в Action Method. Например, если я POST-объект к методу действий, который десериализуется как параметр метода действия, я хотел бы, чтобы он выдавал исключение, если ошибка проверки правильна, как это делает UpdateModel. В настоящий момент стандартное связующее устройство, похоже, ведет себя как TryUpdateModel, просто перелистывая ModelState.IsValid, а не бросая исключение.

[ActionExceptionJsonHandler] 
public ActionResult CreateSomething(SomethingViewData account) 
{ 
// If model binding fails validation an exception should be thrown and no code is executed here 
// Do stuff here 
} 

Если модель по умолчанию Связыватель сгенерировала исключение таким же образом, как UpdateModel делает то IExceptionFilter бы поймать его и обрабатывать возвращения ошибки проверки клиенту. Без этого разработчик должен написать код для проверки ModelState и т.д.

Так нижняя линия у меня есть две смежные вопросы:

  1. Есть ли способ иметь модель связующих по умолчанию сгенерирует исключение при сбое проверки?
  2. Любые мысли об использовании этого подхода в сравнении с ручной проверкой ModelState в каждом методе действия?

Спасибо.

ответ

0

Мое решение оказалось для реализации ActionFilterAttribute, как показано ниже. В OnActionExecuting я проверяю ModelState.IsValid, если он ложный, я сериализую ошибки состояния модели как JSON и устанавливаю объект Эффект, эффективно отменяющий выполнение. Это позволяет мне вернуть пользовательский JSON-сериализованный объект, содержащий ошибки привязки модели.

public override void OnActionExecuting(ActionExecutingContext filterContext) { 

     if (filterContext.Controller.ViewData.ModelState.IsValid) { 
      base.OnActionExecuting(filterContext); 
      return; 
     } 

     var returnDto = new ReturnDto 
          { 
           Success = false, 
           Errors = Tools.GetModelStateErrors(filterContext.Controller.ViewData.ModelState) 
          }; 

     // AllowGet is fine provided we are not returning a javascript array 
     filterContext.Result = new JsonResult { Data = returnDto, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
    }