【问题标题】:How to Handle C# Data Type Model Validation before get to controller如何在到达控制器之前处理 C# 数据类型模型验证
【发布时间】:2020-07-22 11:10:35
【问题描述】:

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

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

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

{
    "Code": "abcde"
}

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

有没有办法处理这种情况?所以我可以在控制器中处理之前返回一些警告/错误? 谢谢

【问题讨论】:

    标签: c# json rest model-validation


    【解决方案1】:

    你得到 0 的原因是因为 string 不能映射到 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。它会在你进入控制器之前运行验证,如果出现问题,它会自动返回 BadRequest。您的模型的流利验证器示例:

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

    【讨论】:

    • 哦,对了,Range 模型验证完成了这项工作。谢谢
    • @Neistow 我相信 FluentValidation 不负责在验证失败时自动返回BadRequest。这应该是由控制器according to the docs 上方的[ApiController] 属性引起的。虽然也许 FluentValidation 也有这方面的功能。
    【解决方案2】:

    将您的模型更改为:

    public class RequestModel 
    {
        [Required]
        public int? Code { set; get; }
    }
    

    Code 在接收到无法解析的值时默认为 null。如果您执行模型验证,它将确保 Code 不为空。

    【讨论】:

      【解决方案3】:

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

      一个实际的例子:

      类模型:

      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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 2012-12-12
        • 2012-12-27
        • 1970-01-01
        相关资源
        最近更新 更多