强制从操作方法参数的ASP.NET MVC 3默认模型绑定器中执行UpdateModel行为



我正在ASP.Net MVC 3应用程序中实现一个错误处理策略。我已经编写了一个实现IExceptionFilter等的属性。它的功能正确,可以处理action方法中抛出的异常,并返回序列化为JSON的异常信息。

我想使用这个属性来处理模型绑定器在向Action方法传递数据时发现的验证错误。例如,如果我将对象POST到反序列化为Action Method参数的Action Method,那么如果像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相比,使用这种方法有什么想法吗

谢谢。

我的解决方案最终实现了ActionFilterAttribute,如下所示。在OnActionExecuting中,我检查ModelState.IsValid,如果它为false,我将模型状态错误序列化为JSON,并设置Result对象有效地取消执行。这允许我返回一个包含模型绑定错误的自定义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 };
    }

相关内容

  • 没有找到相关文章

最新更新