WebApi方法参数的默认值

时间:2016-12-15 10:10:30

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

我有ASP.NET WebAPI操作方法,如下所示:

[HttpGet]
public HttpResponseMessage Test([FromUri] TestRequest request)
{
    request.Process();
    return new HttpResponseMessage(HttpStatusCode.OK);
}

public class TestRequest
{
    public string TestParam1 { get; set; }
    public string TestParam2 { get; set; }

    public void Process()
    {
        // do work
    }
}

如果请求URL具有指定的参数,则可以正常工作,例如http://localhost/test?TestParam1=1。但是当查询字符串为空时,request param为空,我的方法中得到NullReferenceException

有没有办法让WebApi始终使用new TestRequest()的实例作为方法参数,即使查询字符串为空?

4 个答案:

答案 0 :(得分:1)

  1. 定义自定义模型装订器:

    public class TestRequestModelBinder : System.Web.Http.ModelBinding.IModelBinder
    {
        public bool BindModel(HttpActionContext actionContext,
                              System.Web.Http.ModelBinding.ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType != typeof(TestRequest)) return false;
    
            bindingContext.Model = new TestRequest();
    
            var parameters = actionContext.Request.RequestUri.ParseQueryString();   
    
            typeof(TestRequest)
                .GetProperties()
                .Select(property => property.Name)
                .ToList()
                .ForEach(propertyName =>
                {
                    var parameterValue = parameters[propertyName];
    
                    if(parameterValue == null) return;      
    
                    typeof(TestRequest).GetProperty(propertyName).SetValue(bindingContext.Model, parameterValue);
                });
    
            return bindingContext.ModelState.IsValid;
        }
    }
    
  2. 使用它:

    [HttpGet]
    public HttpResponseMessage Test([System.Web.Http.ModelBinding.ModelBinder(typeof(TestRequestModelBinder))] TestRequest request)
    {
        // your code
    }
    

答案 1 :(得分:0)

您只需要测试null

[HttpGet]
public HttpResponseMessage Test([FromUri] TestRequest request)
{
    if (request == null)
       request = new TestRequest();
    var result = request.Process();

答案 2 :(得分:0)

使用Null是最简单的方法,虽然不是正确的设计。

否则,您可以使用TestRequest类型的自定义模型绑定器创建自定义行为。你可以找到相同的例子。

答案 3 :(得分:0)

只能在参​​数列表中将默认值设置为常量,因此它不会按您的意愿工作。

如果您有这样的方法签名,您可以将默认值设置为“ok”,例如

public HttpResponseMessage Test(string request = "ok")

在你的场景中,IMO,最好的方法是将参数值设置为可空,并在控制器中检查它

[HttpGet]
public HttpResponseMessage Test([FromUri] TestRequest? request)
{
    if(request.HasValue)
    {
        //Do your thing
    }
}
相关问题