处理JSON错误仍然将ModelState.IsValid设置为false

时间:2019-10-09 09:48:13

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

我的控制器像这样接受Json参数作为参数:

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

有时我们收到发送给我们的无效Json,而我的Json序列化器有一个错误处理程序被调用。 我设置了

ErrorArgs.ErrorContext.Handled = true;

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

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

1 个答案:

答案 0 :(得分:0)

如果要迁移到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