如何在进入控制器之前处理C#数据类型模型验证
我在C#WebAPI中有这个请求模型 然后我有一个API控制器,它接收该模型作为它的请求主体(POST)。问题是,如果我为了测试目的运行一个否定的案例。我请求一些类似这样的json如何在进入控制器之前处理C#数据类型模型验证,c#,json,rest,model-validation,C#,Json,Rest,Model Validation,我在C#WebAPI中有这个请求模型 然后我有一个API控制器,它接收该模型作为它的请求主体(POST)。问题是,如果我为了测试目的运行一个否定的案例。我请求一些类似这样的json { "Code": "abcde" } 我的请求模型自动将其code值设置为0。0是一个有效值 有没有办法处理这个案子?所以我可以在控制器中处理之前返回一些警告/错误? 谢谢之所以得到0,是因为字符串不能映射到int,所以它只留下一个默认值(即零)。要验证用户输入,可
{
"Code": "abcde"
}
我的请求模型自动将其code
值设置为0。0是一个有效值
有没有办法处理这个案子?所以我可以在控制器中处理之前返回一些警告/错误?
谢谢之所以得到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
}
在控制器中,您可以检查模型状态是否有效并正确响应。基本上,在控制器中方法的开头,您应该编写如下内容:
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?
),并将所有验证工作委托给。它将在您进入控制器之前运行验证,并在出现问题时自动返回BADDREQUEST。模型的fluent验证器示例:
public class RequestModelValidator : AbstractValidator<RequestModel>
{
public RequestModelValidator()
{
RuleFor(m => m.Code).NotNull().WithMessage("*Your msg*");
}
}
公共类RequestModelValidator:AbstractValidator
{
公共RequestModelValidator()
{
RuleFor(m=>m.Code).NotNull().WithMessage(“*您的消息*”);
}
}
之所以得到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
}
在控制器中,您可以检查模型状态是否有效并正确响应。基本上,在控制器中方法的开头,您应该编写如下内容:
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?
),并将所有验证工作委托给。它将在您进入控制器之前运行验证,并在出现问题时自动返回BADDREQUEST。模型的fluent验证器示例:
public class RequestModelValidator : AbstractValidator<RequestModel>
{
public RequestModelValidator()
{
RuleFor(m => m.Code).NotNull().WithMessage("*Your msg*");
}
}
公共类RequestModelValidator:AbstractValidator
{
公共RequestModelValidator()
{
RuleFor(m=>m.Code).NotNull().WithMessage(“*您的消息*”);
}
}
将您的型号更改为:
公共类请求模型
{
[必需]
公共int?代码{set;get;}
}
当接收到无法解析的值时,
code
将默认为null。如果您执行模型验证,它将确保code
不为空。将您的模型更改为:
公共类请求模型
{
[必需]
公共int?代码{set;get;}
}
当接收到无法解析的值时,
code
将默认为null。如果您执行模型验证,它将确保code
不为空。如果您在一个属性中发送一个字符串,该属性自然会接收一个整数,那么完整的对象将在其控制器中到达空值,正如您所提到的,字符串不会转换为零
一个实际例子:
类别模型:
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);
}
}
如果您发送一个字符串,在一个应该自然接收整数的属性中,完整的对象将在其控制器中到达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);
}
}
哦,是的,
Range
模型验证完成了这项工作。。Thanks@Neistow我认为FluentValidation不负责在验证失败时自动返回BadRequest
。这应该是由控制器上方的[ApiController]
属性引起的。虽然FluentValidation可能也有这方面的功能。哦,对了,Range
模型验证可以完成这项工作。。Thanks@Neistow我认为FluentValidation不负责在验证失败时自动返回BadRequest
。这应该是由控制器上方的[ApiController]
属性引起的。虽然FluentValidation也有一个功能。