如何在获取控制器之前处理 C# 数据类型模型验证

How to Handle C# Data Type Model Validation before get to controller

我在 C# Web 中有这个请求模型API

public class RequestModel{
    public int Code { set; get; }
}

然后我有 API 控制器接收该模型作为其请求主体 (POST)。问题是,如果我 运行 是出于测试目的的否定案例。我要求一些 json 这样的

{
    "Code": "abcde"
}

我的请求模型自动将其 Code 值设置为 0。0 是一个有效值

有没有什么办法处理这个案子的?所以我可以 return 在我的控制器中处理它之前发出一些警告/错误? 谢谢

你得到 0 的原因是因为字符串不能映射到 int,所以它只留下一个默认值(即零)。要验证用户输入,您可以使用属性。

尝试这样的事情:

public class RequestModel
{
    [Range(1, int.MaxValue, ErrorMessage = "*Your warning*")]
    public int Code { set; get; }
}

在您的控制器中,您可以检查模型状态是否有效并正确响应。基本上在控制器方法的开头你应该写这样的东西:

if(!ModelState.IsValid)
{
    // Return errors for example
}
else
{
    // Something else
}

有一种更优雅的方法可以进行此类验证。您可以简单地使您的字段可为空 (int?) 并将所有验证工作委托给 fluent validator。它会 运行 在你进入控制器之前进行验证,如果出现问题,它会自动 return BadRequest。模型的流畅验证器示例:

public class RequestModelValidator : AbstractValidator<RequestModel>
{
    public RequestModelValidator()
    {
        RuleFor(m => m.Code).NotNull().WithMessage("*Your msg*");
    }
}

将您的模型更改为:

public class RequestModel 
{
    [Required]
    public int? Code { set; get; }
}
当接收到无法解析的值时,

Code 将默认为 null。如果您执行模型验证,它将确保 Code 不为空。

如果您发送一个字符串,在 属性 中自然应该接收一个整数,完整的对象将在其控制器中到达 null,正如您提到的那样,不会将字符串转换为零。

实际例子:

Class 型号:

public class RequestModel
{
    public int Code { set; get; }
}

您的控制器:

using Microsoft.AspNetCore.Mvc;

public class Test: Controller
{
    [HttpPost("/test")]
    public IActionResult Test([FromBody] RequestModel requestModel)
    {
        if (requestModel == null)
        {
            return BadRequest("Invalid request");
        }
        return Ok(requestModel);
    }
}