Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# ASP.NET Core 2.0中的验证:语法与验证问题_C#_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

C# ASP.NET Core 2.0中的验证:语法与验证问题

C# ASP.NET Core 2.0中的验证:语法与验证问题,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,在我的ASP.NET Core 2.0应用程序中,当输入中出现语法问题(例如格式错误的json)时,我想抛出一个400错误请求,对于其他错误(例如必需的、StringLength等),我想抛出一个422不可处理的实体 有没有办法知道(可能是查看ModelState)是语法(400)问题还是验证问题(422) 这是我正在使用的控制器操作 [HttpPost] public async Task<IActionResult> CreateArticle([FromBody

在我的ASP.NET Core 2.0应用程序中,当输入中出现语法问题(例如格式错误的json)时,我想抛出一个
400错误请求
,对于其他错误(例如必需的、StringLength等),我想抛出一个
422不可处理的实体

有没有办法知道(可能是查看
ModelState
)是语法(
400
)问题还是验证问题(
422

这是我正在使用的控制器操作

    [HttpPost]
    public async Task<IActionResult> CreateArticle([FromBody] CreateArticleInput input)
    {
        if(!ModelState.IsValid)
        {
            // Return 400 or 422
        }
    }
[HttpPost]
公共异步任务CreateArticle([FromBody]CreateArticleInput)
{
如果(!ModelState.IsValid)
{
//返回400或422
}
}

我不太确定你在问什么,听起来像是
CreateArticleInput
可能是某种JSON输入,但我认为编写自己的自定义模型绑定器是一种方法。 然后,如果“原始”输入没有正确映射到您的
CreateArticleInput
,您可以用任何方式处理它。 并可能从modelbinder返回以下内容

bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;
然后

在控制器中,如果
CreateArticleInput输入为空,则返回400


当出现语法错误/格式错误的有效负载时,模型绑定器将不会填充
输入
参数。鉴于此,您可以检查
input==null
。当不满足对象的要求时,
ModelState.IsValid
将返回
false
,您可以相应地返回HTTP 422

一些示例代码:

public class MyObj
{
    [Required]
    public string Foo { get; set; }
}


[HttpPost]
public IActionResult Post([FromBody]MyObj obj)
{
    if (obj == null)
    {
        return BadRequest();
    }

    if (!ModelState.IsValid)
    {
        return UnprocessableEntity(ModelState);
    }

    return Ok();
}

发布无效/格式错误的有效负载时,
obj
null
并返回错误请求(HTTP 400)。当有效负载是正确的JSON,但
Foo
属性是
null
ModelState.IsValid
将返回
false
,这将导致HTTP 422结果和验证绑定错误。当一切正常时,它将返回一个200。

根据您使用它的方式,您可以从HttpContext获取它


返回状态码(HttpContext.Response.StatusCode)

无法在型号活页夹级别上混合n匹配返回代码。即使是第三方解决方案,如FluentValidation,也只允许对失败的结果使用单一返回模式

正如人们所建议的那样,在控制器级别上添加一个额外的语法/语义检查,并保持输入验证的原样—更干净