如何在ASP.NET Web API中使复杂类型所需的查询参数

时间:2018-08-24 09:13:53

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

我有一个执行以下操作的控制器:

public class MyController
{
    public IHttpActionResult GetSomething([FromUri] int param1, [FromUri] int param2 = 2)
    {
        // some code...
    }
}

在这种情况下,如果我使用http://localhost/myapi/My/Something?param=1进行请求,则一切正常,需要param1,param2获取其默认值。如果我执行http://localhost/myapi/My/Something,则会收到“找不到与请求URI匹配的HTTP资源”的消息,也可以。

但是如果我将方法签名更改为

public IHttpActionResult GetSomething([FromUri] RequestParames request)

其中

public class RequestParames
{
    public int Param1 {get; set;}
    public int Param2 {get; set;} = 2;
}

在这种情况下,WebAPI无法确定我的哪些复杂类型属性是必需的,哪些是可选的,所有这些都变为可选。因此,如果我请求http://localhost/myapi/My/Something,则不会收到任何错误,因为我的内部代码希望提供该错误。

所以问题是是否有某种方法可以标记我需要的复杂类型属性?

2 个答案:

答案 0 :(得分:1)

我相信您必须编写代码进行验证,然后返回404错误。

RequestParames类

public class RequestParames
{
    public int? param1 {get; set;}
    public int param2 {get; set;} = 2;
}

操作方法验证

public IHttpActionResult GetSomething([FromUri] RequestParames request) {
  if(request == null || request.param1 == null) { 
     return NotFound();
  }
}

答案 1 :(得分:0)

通过自定义ActionFilterAttribute内的RequiredAttribute和ModelState检查可以做到这一点。

public class RequestParames
{
    [Required]
    public int? Param1 {get; set;}
    public int Param2 {get; set;} = 2;
}

internal class ValidateModelAttribute : ActionFilterAttribute
{
    #region Overrides of ActionFilterAttribute

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        base.OnActionExecuting(actionContext);

        var modelState = actionContext.ModelState;
        if(!modelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
        }
     }

     #endregion
}

public class MyController
{
    [ValidateModel]
    public IHttpActionResult GetSomething([FromUri] RequestParames request)
    {
        // some code...
    }
}