如何在获取控制器之前处理 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);
}
}
我在 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);
}
}