【问题标题】:WEB API C# - Filter parameter validationWEB API C# - 过滤器参数验证
【发布时间】:2019-09-17 15:11:05
【问题描述】:

我正在尝试使用最佳实践通过示例进行简单验证来创建 API。

public class ClientController
{
       [HttpGet]
       [Authorize] 
       public IHttpActionResult Clients([FromUri]string Initialdate,[FromUri] string finalDate)
       {
           return _clientRepository.GetClients();
       }
}


public class ClientRepository
{
        //some code that access data layer
        public IEnumerable<Client> GetClients(string initialDate,string finalDate)
        {
             //HERE IS WHAT IM LOOKING FOR
             //HERE I WANT TO VALIDATE THE DATE PARAMETER PROVIDED IN REQUEST AND RETURN 
             //VALIDATION LIST WITH ERROR DESCRIPTION IN JSON

             _daoClient.ExecuteProcedure(initialDate,finalDate);
        }
}


public class Client
{
    public int Id {get;set;}
    public string Name {get;set;}
}

那么,我如何使用参数过滤器之类的操作在请求中构建这种简单的参数验证?

【问题讨论】:

  • 我建议不要在您的存储库中进行验证。有几种方法可以验证查看此blog
  • 见过this?
  • 您想在类Client 属性上添加属性验证?
  • 不,我想从 get 方法验证查询参数,并在 Json 列表中返回它们的问题。示例:GetClient 的日期无效,并返回错误,这就是我不能使用模型状态的原因。因为它更像是一个过滤器而不是模型的属性。
  • @RenanDuarte 请在下面查看我的答案,您可以这样做。

标签: .net validation asp.net-web-api


【解决方案1】:

你必须像这样明确地验证:

[HttpGet]
[Authorize]
public IHttpActionResult Clients([FromUri]string Initialdate, [FromUri] string finalDate)
{
         bool isInitialDate = DateTime.TryParse(Initialdate, out DateTime tempInitialdate);
         bool isFinalDate = DateTime.TryParse(finalDate, out DateTime tempfinalDate);

         List<string> _errorMessage = new List<string>();

         if (!isInitialDate)
              _errorMessage.Add("Initial date is invalid");

         if(!isFinalDate)
             _errorMessage.Add("Final date is invalid");

         if(isInitialDate && isFinalDate)
         {
                //your business logic
                return _clientRepository.GetClients();
         }

            return Json(new { success = false, error = _errorMessage });
}

【讨论】:

  • 不错,但我正在考虑从控制器中抽象出这个验证,并将责任转移到另一层,并返回错误列表和用户请求的信息。
  • 亲爱的@RenanDuarte 我明白你的意思,你需要创建一个拦截器类并在startup.cs`` e.g.: config.MessageHandlers.Insert(0, new ApiDelegatingHandler());``` 在@987654325 中配置@class 你需要继承public class ApiDelegatingHandler : DelegatingHandler 并编写你的自定义验证以实现上述要求。我强烈建议使用上述逻辑在controller 级别进行验证。
  • 首先感谢您的贡献。那么,您能告诉我在控制器级别维护参数验证的原因吗?