Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证ASP.NET核心API中格式无效的值_C#_Asp.net Core_Asp.net Core 2.2 - Fatal编程技术网

C# 验证ASP.NET核心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?我可以检查它是否为空,或者如果定义了,它是否在过去 这有意义吗? 发送至行动的数据包括无效的发

在ASP.NET Core 2.2 API上,我有以下操作:

public async Task<IActionResult> Create([FromBody]Model model) {
}
属性
PublishedAt
是必需的,并且必须在过去

在调用该操作时,我能够预测两种不同的场景:

  • 发送到操作的数据不包括
    PublishedAt
    PublishedAt
    为空

    通过使用
    DateTime?
    我可以检查它是否为空,或者如果定义了,它是否在过去

    这有意义吗?

  • 发送至行动的数据包括无效的发布日期(2019-20-40)

    在这种情况下,我意识到
    模型
    变为空,因此我无法验证它

    我也无法发回友好的信息,例如:

    “发布日期格式无效”

    当日期时间格式错误时,如何返回友好消息?

    我希望避免使用字符串作为
    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”的内容无效,我想发送一条错误消息。在这种情况下,验证不会触发,因为错误在之前。如果您想接受任何内容并定义自己的消息,可以将类型更改为字符串并验证其格式是否正确,尽管可能有更好的方法。但是如果你有约会时间的要求,