【问题标题】:Handling JSON errors still sets ModelState.IsValid to false处理 JSON 错误仍将 ModelState.IsValid 设置为 false
【发布时间】:2019-10-09 09:48:13
【问题描述】:

我的控制器接受一个 Json 参数作为参数,如下所示:

[Route("status")]
[HttpPost]
public Task<JsonResult> Status([FromBody]StatusParameters parameters){}

有时我们会收到无效的 Json 发送给我们,我有一个错误处理程序,用于调用我们的 Json-serializer。 我设置了

ErrorArgs.ErrorContext.Handled = true;

并进行适当的处​​理(将可空日期设置为空)。 然而,当呼叫进入控制器时,我检查了

ModelState.IsValid ,它仍然包含 Json 解析错误并返回 false

【问题讨论】:

  • 您可以尝试为您的 StatusParameters 类编写自定义模型绑定器,您可以在其中完全控制 ModelState
  • 对于其他对此问题感兴趣的人,这就是我所做的,它解决了我的问题。如果您将此作为答案发布,我会将其标记为已回答。

标签: c# json asp.net-mvc iis json.net


【解决方案1】:

如果您要迁移到 ASP.NET Core,此过程会变得容易得多。话虽如此,您可以创建一个自定义模型绑定器,让您可以完全访问绑定上下文。您可以在模型绑定器中对 DTO 执行任何验证,并通过可以在控制器中获取的绑定上下文添加任何 ModelState 错误。

using System.ComponentModel;
using System.Web.Mvc;
public StatusParametersModelBinder : DefaultModelBinder
{
    public override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        if (propertyDescriptor.ComponentType != typeof(StatusParameters))
        {
            return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
        }

        // Get the object and validate it
        var obj = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (IsInvalid(obj))
        {
            bindingContext.ModelState.AddModelError("", "");
        }

        return obj;
    }
}

请参阅:System.Web.Mvc.DefaultModelBinder

【讨论】:

  • 这就是我最终为其他好奇的人解决它的方法(尽管我们仍在使用 .net 框架)。
猜你喜欢
  • 2016-10-12
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多