【问题标题】:How to pass dictionary parameter to web-api method?如何将字典参数传递给 web-api 方法?
【发布时间】:2019-08-09 11:24:01
【问题描述】:

我在这里阅读了所有类似的问题,但我无法提出解决方案。我正在尝试调用 web-api 方法:

[HttpGet]
public SearchViewModel Get(SearchTypes type, string text, [FromUri]Dictionary<string, string> toyParams)
{
    //Code here
}

我想从 uri 中获取最后一个参数。我试过了

http://localhost:39101/#!/search/toys/fox?someParameter=123

和

http://localhost:39101/#!/search/toys/fox?toyParams[0].Key=someParameter&toyParams[0].Value=123

但 toyParams Dictionary 始终为空。

【问题讨论】:

  • 在 GET 请求中通过 URI 传递字典键/值!!。为什么你要检索的数据没有某种id,这样你就不用在URI中传递这么大的数据了
  • 我假设你想符合 GET 请求语义。否则,如果考虑到您正在传递相当多的数据,它是一个通用解决方案,那么您可能需要执行一个好的旧 POST 请求。
  • 我认为你做不到。原因是,web api 模型默认模型绑定与名称比较一起使用。例如,如果您有一个名为“toyParams[0].Key”的参数(尽管您不能拥有它。)它将与查询字符串参数“toyParams[0],Key”进行映射,其值为“someParameter”等等上。您也许可以通过自定义模型绑定来实现。但是,请不要这样做。我会等待答案来更新我的知识。
  • 这涉及一个 POST 请求,并且数据是作为帖子正文而不是通过 url 发送的。
  • 我正在考虑您的参数搜索问题。你必须有你的搜索参数,比如 param1=value1&param2=value2 等等,对吗?现在您可以创建一个包含属性的类(DTO,数据传输对象),即 param1、param2 及其各自的数据类型。它会填满的!您希望这种方法作为答案吗?

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


【解决方案1】:

刚刚发现在另一个问题here 中隐含地回答了它。

它指向的解决方案重定向到Model Binding in ASP.NET Core。

或者,简短的回答,您只需像这样编写您的请求:

http://localhost:39101/#!/search/toys/fox?toyParams[someParameter1]=123&toyParams[someParameter2]=456

【讨论】:

    【解决方案2】:

    尽管它已经很晚了,但可以使用以下方法将查询参数作为名称/值对返回 - this.Url.Request.GetQueryNameValuePairs()

    我有以下网址 - http://localhost:49980/api/MyRestAPI/postSomeData/?a=v&d=e

    以下是我的方法,用 Web API 2 编写 -

    [HttpPost]
    public IHttpActionResult SaveDataFromRestToDB(string dataKey) {
         var parameters = this.Url.Request.GetQueryNameValuePairs();
         //parameters returns KeyValuePair<string, string>[2], containing values passed in Url Query
    }
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      一种简单的方法,而不是字典:

          //DTO
          public class SearchDTO
          {
              public int MyProperty1 { get; set; }
              public int MyProperty2 { get; set; }
              public int MyProperty3 { get; set; }
          }
      

      其中MyProperty1、MyProperty2、MyProperty3 是必须搜索的参数。

              //GET Method
              public string Get([FromUri]SearchDTO searchDTO)
              {
                  return "search result";
              }
      

      以下是调用网址:

      http://localhost:56880/api/values?myproperty1=1&myproperty2=2&myproperty3=3

      【讨论】:

      • 旧答案,但这不是一个好的解决方案,在您必须传递多个动态参数的情况下,此解决方案无效。
      • 在 GET 请求的情况下还有什么其他方法可用?
      • 我真的很想知道“在 GET 请求的情况下还有什么其他方法可用?” Downvoters,你能解释一下吗(我想知道,因为我想学习一些东西)
      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多