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



>我有一个具有以下操作的控制器:

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 我不会收到任何错误,这是我的内部代码期望提供它。

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

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

请求参数类

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();
}
}

设法在我的自定义 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...
}
}

最新更新