我有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()
的实例作为方法参数,即使查询字符串为空?
答案 0 :(得分: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;
}
}
使用它:
[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
}
}