我有一个执行以下操作的控制器:
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,则不会收到任何错误,因为我的内部代码希望提供该错误。
所以问题是是否有某种方法可以标记我需要的复杂类型属性?
答案 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...
}
}