【问题标题】:Can I map multiple query string values to a single controller (object) parameter?我可以将多个查询字符串值映射到单个控制器(对象)参数吗?
【发布时间】:2012-08-31 09:19:30
【问题描述】:

我正在构建一个 ASP.NET Web API REST 服务。

我必须处理的调用(URL)是由另一方修复的,并且有许多查询字符串参数。

与其让我的控制器接受十几个参数,有什么方法可以将查询参数映射到一个对象并将其传递给控制器​​?

我知道我可以通过 GetQueryNameValuePairs 在控制器中访问它们,但我想知道是否有办法以这种方式使用数据绑定。

【问题讨论】:

    标签: c# asp.net-web-api query-string model-binding


    【解决方案1】:

    是的,

    定义一个模型,例如:

    public class InputModel
    {
        public string Param1 { get; set; }
        public string Param2 { get; set; }
    }
    

    然后调整你的动作:

    public HttpResponseMessage Put(InputModel model) { ... }
    

    很像 MVC,API 控制器支持 模型绑定,有一个基础设施来处理这个,它本身是可扩展的。我会在谷歌上搜索 ASP.NET MVC 模型绑定的示例。

    【讨论】:

    • 我试过这个,但我的模型参数总是为空。我在查询字符串中有一个“orderNumber”,在我的模型类中有一个 OrderNumber 属性,但它似乎没有绑定。不确定我是否遗漏了一些明显的东西。
    • 当我使用标准 MVC 控制器时绑定很好。
    • 似乎您需要使用 [FromUri] 属性 - 例如public HttpResponseMessage Post([FromUri] MyModel 模型)。
    • 如果你想同时接受 POST 和 GET 操作,这不起作用。您可以使用 [FromUri] 但它只能从查询字符串而不是 PostBuffer 或原始数据中工作。这实际上是 Web API 的主要缺点 - 灵活性远低于 MVC 在 ModelBinding 中提供的灵活性。
    【解决方案2】:

    在将模型对象传递给控制器​​时,ASP.NET Web API 似乎需要使用 [FromUri]。例如:

    public HttpResponseMessage Post([FromUri] MyModel model) { ... }
    

    查看MSDN blog post了解更多详情。

    【讨论】:

      【解决方案3】:

      我会简单地创建一个查询字符串解析器:

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

      【讨论】:

        猜你喜欢
        • 2014-08-04
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多