Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理JSON错误仍然会将ModelState.IsValid设置为false_C#_Json_Asp.net Mvc_Iis_Json.net - Fatal编程技术网

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

C# 处理JSON错误仍然会将ModelState.IsValid设置为false,c#,json,asp.net-mvc,iis,json.net,C#,Json,Asp.net Mvc,Iis,Json.net,我的控制器接受Json参数作为参数,如下所示: [Route("status")] [HttpPost] public Task<JsonResult> Status([FromBody]StatusParameters parameters){} 并进行适当的处理(将可为null的日期设置为null)。 然而,当呼叫进入控制器,我检查 ModelState.IsValid ,它仍然包含Json解析错误并返回false如果要迁移到ASP.NET Core,此过程将变得容易得多。也就

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

[Route("status")]
[HttpPost]
public Task<JsonResult> Status([FromBody]StatusParameters parameters){}
并进行适当的处理(将可为null的日期设置为null)。 然而,当呼叫进入控制器,我检查

ModelState.IsValid

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

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


请参阅:。

您可以尝试为您的
StatusParameters
类编写一个自定义模型绑定器,您可以完全控制
ModelState
。对于其他对此问题感兴趣的人,这就是我所做的,它解决了我的问题。如果你将此作为答案发布,我会将其标记为已回答。对于其他好奇的人(尽管我们仍在使用.net Framework),我最终就是这样解决的。
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;
    }
}