C# 验证ASP.NET核心API中格式无效的值
在ASP.NET Core 2.2 API上,我有以下操作:C# 验证ASP.NET核心API中格式无效的值,c#,asp.net-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.2,在ASP.NET Core 2.2 API上,我有以下操作: public async Task<IActionResult> Create([FromBody]Model model) { } 属性PublishedAt是必需的,并且必须在过去 在调用该操作时,我能够预测两种不同的场景: 发送到操作的数据不包括PublishedAt或PublishedAt为空 通过使用DateTime?我可以检查它是否为空,或者如果定义了,它是否在过去 这有意义吗? 发送至行动的数据包括无效的发
public async Task<IActionResult> Create([FromBody]Model model) {
}
属性PublishedAt
是必需的,并且必须在过去
在调用该操作时,我能够预测两种不同的场景:
PublishedAt
或PublishedAt
为空
通过使用DateTime?
我可以检查它是否为空,或者如果定义了,它是否在过去
这有意义吗?模型
变为空,因此我无法验证它
我也无法发回友好的信息,例如:
“发布日期格式无效”
当日期时间格式错误时,如何返回友好消息?
我希望避免使用字符串作为PublishedAt
的数据类型
也许用一个定制的模型活页夹您可以做的是将
Required
属性置于PublishedAt
public class Model
{
[Required]
public DateTime? PublishedAt { get; set; }
}
[ApiController]
public class ValuesController : ControllerBase
{
public async Task<IActionResult> Create([FromBody]Model model)
{
}
}
公共类模型
{
[必需]
public DateTime?PublishedAt{get;set;}
}
[ApiController]
公共类值控制器:控制器库
{
公共异步任务创建([FromBody]模型)
{
}
}
如果您的控制器上有ApiController属性,那么如果该属性不存在,它将自动响应BADDREQUEST
类似地,您可以在消息中添加自己的自定义验证属性。Asp.Net提供了一个如何执行此操作的示例。您可以做的是将
Required
属性置于PublishedAt
public class Model
{
[Required]
public DateTime? PublishedAt { get; set; }
}
[ApiController]
public class ValuesController : ControllerBase
{
public async Task<IActionResult> Create([FromBody]Model model)
{
}
}
公共类模型
{
[必需]
public DateTime?PublishedAt{get;set;}
}
[ApiController]
公共类值控制器:控制器库
{
公共异步任务创建([FromBody]模型)
{
}
}
如果您的控制器上有ApiController属性,那么如果该属性不存在,它将自动响应BADDREQUEST
类似地,您可以在消息中添加自己的自定义验证属性。Asp.Net提供了一个关于如何做到这一点的示例
IMHO,我喜欢下面的方法,并且已经广泛使用,没有任何问题。这种方法的好处在于它保持了模型的整洁,并支持关注点的分离。模型的验证逻辑是完全独立的
尝试使用FluentValidation
。你可以详细阅读。这是一个NuGet软件包,你可以通过NuGet.org下载。安装后,您可以在ConfigureServices
中注册它,如下所示:
1 public void ConfigureServices(IServiceCollection services)
2 {
3 services.AddMvc(setup => {
4 //...mvc setup...
5 }).AddFluentValidation(configuration => configuration
6 .RegisterValidatorsFromAssemblyContaining<Startup>());
7 }
上述验证器将在模型绑定过程后执行,如果验证失败,WithMessage
语句将向ModelState添加错误。因为您有[ApiController]
属性。您的模型将被验证,它将返回您在WithMessage
语句中指定的消息
或者,您可以手动检查动作方法中的ModelState.IsValid
,并返回带有ModelState的ObjectResult
IMHO,我喜欢下面的方法,并且已经广泛使用,没有任何问题。这种方法的好处在于它保持了模型的整洁,并支持关注点的分离。模型的验证逻辑是完全独立的
尝试使用FluentValidation
。你可以详细阅读。这是一个NuGet软件包,你可以通过NuGet.org下载。安装后,您可以在ConfigureServices
中注册它,如下所示:
1 public void ConfigureServices(IServiceCollection services)
2 {
3 services.AddMvc(setup => {
4 //...mvc setup...
5 }).AddFluentValidation(configuration => configuration
6 .RegisterValidatorsFromAssemblyContaining<Startup>());
7 }
上述验证器将在模型绑定过程后执行,如果验证失败,WithMessage
语句将向ModelState添加错误。因为您有[ApiController]
属性。您的模型将被验证,它将返回您在WithMessage
语句中指定的消息
或者,您可以手动检查动作方法中的ModelState.IsValid
,并返回带有ModelState的ObjectResult
。这不是重点。。。如果定义了PublishDAT,但类似于“2018400sdsd”的内容无效,我想发送一条错误消息。在这种情况下,验证不会触发,因为错误在之前。如果您想接受任何内容并定义自己的消息,可以将类型更改为字符串并验证其格式是否正确,尽管可能有更好的方法。虽然如果您在datetime上有required,您将不会得到null,但是会有一个错误返回到客户端,因为参数是必需的,但无法解析,这正是我需要的,但不使用字符串…:-)。。。似乎在使用FromBody时,JSonParser负责绑定,如果一旦停止就失败了,并且没有使用有效的值创建部分模型。。。我正试着绕过去。有什么想法吗?如果我发送了错误的输入:“无法将字符串转换为日期时间:2019-01dd-01。路径‘publishedAt’,第2行,位置31。”我会收到这个错误,但这还不够吗?是否要返回自定义消息?请尝试向模型中添加其他属性,例如“字符串标题”。如果您提交了一个带有无效发布日期的有效标题,您将看到该模型变为空。我想返回2个错误,说“PublishedAt数据的格式无效”,但仍然能够验证标题。这不是重点。。。如果定义了PublishDAT,但类似于“2018400sdsd”的内容无效,我想发送一条错误消息。在这种情况下,验证不会触发,因为错误在之前。如果您想接受任何内容并定义自己的消息,可以将类型更改为字符串并验证其格式是否正确,尽管可能有更好的方法。但是如果你有约会时间的要求,