我正在构建一个 ASP.NET Web API REST 服务。
我必须处理的调用(URL)由另一方修复,并且有许多查询字符串参数。
与其让我的控制器采用十几个参数,有什么方法可以将查询参数映射到一个对象并将其传递给控制器?
我知道我可以通过 GetQueryNameValuePairs 在控制器中访问它们,但我想知道是否有办法以这种方式使用数据绑定。
我正在构建一个 ASP.NET Web API REST 服务。
我必须处理的调用(URL)由另一方修复,并且有许多查询字符串参数。
与其让我的控制器采用十几个参数,有什么方法可以将查询参数映射到一个对象并将其传递给控制器?
我知道我可以通过 GetQueryNameValuePairs 在控制器中访问它们,但我想知道是否有办法以这种方式使用数据绑定。
是的,
定义一个模型,例如:
public class InputModel
{
public string Param1 { get; set; }
public string Param2 { get; set; }
}
然后调整你的动作:
public HttpResponseMessage Put(InputModel model) { ... }
很像 MVC,API 控制器支持模型绑定,有一个基础设施来处理这个,它本身是可扩展的。我会在谷歌上搜索 ASP.NET MVC 模型绑定的示例。
将模型对象传递给控制器时,ASP.NET Web API 似乎需要使用 [FromUri]。例如:
public HttpResponseMessage Post([FromUri] MyModel model) { ... }
有关详细信息,请参阅此MSDN 博客文章。
我会简单地创建一个查询字符串解析器:
protected IDictionary<string, string> GetQueryParameters(string queryString)
{
var retval = new Dictionary<string, string>();
foreach (var item in queryString.TrimStart('?').Split(new[] {'&'}, StringSplitOptions.RemoveEmptyEntries))
{
var split = item.Split('=');
retval.Add(split[0], split[1]);
}
return retval;
}
然后从控制器调用:
public class DummyController : ApiController
{
[HttpGet]
public string SayHello(string name="")
{
var q = GetQueryParameters(Request.RequestUri.Query);
return string.Format("Hello {0}", name);
}
}