【问题标题】:ASP.NET MVC Pass multiple optional parameters field=valueASP.NET MVC 传递多个可选参数 field=value
【发布时间】:2021-11-05 03:38:01
【问题描述】:

我正在尝试将多个参数传递给 GET 方法

[Route("v1/v2/v3/?{param}")]
    public async Task<HttpResponseMessage> GetContent(string param)

来自当前的请求,可能看起来像:

https://localhost:44363/v1/v2/v3/?isFormatSimple=true

https://localhost:44363/v1/v2/v3/?vers=v1.2.7&allow=true

首先,我必须从 isFormatSimple 获取值,第二个,v1.2.7true

但我不知道如何获得这些值。我可以检查单个方法中是否有特定参数吗? 有人可以帮忙吗?谢谢

【问题讨论】:

  • 据我了解,您想为您的 WEB 应用程序编写一个端点,该端点可以使用 HTTP GET 方法在路由 https://localhost:44363/v1/v2/v3 上调用,并且您希望通过 多个(字符串)参数给它。对吗?
  • @turanszkik 是的

标签: c# asp.net-mvc asp.net-mvc-routing


【解决方案1】:

最简单的选择是简单地重载您的 API 控制器方法(每组参数 1 个重载)。然后,当您向其发送请求时,它将确定哪个重载与您的请求格式匹配并使用该重载。 (我在工作中使用过这个,这篇文章也展示了它的用法:https://www.telerik.com/blogs/how-to-pass-multiple-parameters-get-method-aspnet-core-mvc) 示例代码:

[HttpGet ("v1/v2/v3/")]
public async Task<HttpResponseMessage> GetContent([FromQuery] bool isFormatSimple)
{ 
  // your method
}

[HttpGet ("v1/v2/v3/")]
public async Task<HttpResponseMessage> GetContent([FromQuery] string version, [FromQuery] bool allow)
{ 
  // your method
}

下一个最简单的选择是将参数实际放入您的路由中,而不是放入您的查询中,并且仍然使用重载: 代码:

[HttpGet ("v1/v2/v3/{isFormatSimple:bool}")]
public async Task<HttpResponseMessage> GetContent([FromRoute] bool isFormatSimple)
{ 
  // your method
}

[HttpGet ("v1/v2/v3/{version}&{allow:bool}")]
public async Task<HttpResponseMessage> GetContent([FromRoute] string version, [FromRoute] bool allow)
{ 
  // your method
}

【讨论】:

    【解决方案2】:

    您可以在下面看到调用 HTTP GET 端点并将多个参数传递给它的两种方式

    首先它是一种基本的方法,使用在网络上广泛使用的常规参数:

        [HttpGet]
        [Route("ParamsInBasicUrlFormat")]
        public async Task<string> ParamsInBasicUrlFormat(string v1, string v2, string v3)
        {
            return $"{v1};{v2};{v3}";
        }
    

    您可以使用以下格式调用它:http://localhost:61652/ParamsInBasicUrlFormat?v1=first param&amp;v2=second param&amp;v3=third param

    其次,如果你想在 URL 中传递参数,就像它是路径的一部分:

        [HttpGet]
        [Route("ParamsInOtherUrlFormat/{v1}/{v2}/{v3}")]
        public async Task<string> ParamsInOtherUrlFormat(string v1, string v2, string v3)
        {
            return $"{v1};{v2};{v3}";
        }
    

    您可以使用以下格式调用它:http://localhost:61652/ParamsInOtherUrlFormat/first/second/third

    如果您将{something} 放在Route 属性 中,则基本思想也必须将其放在方法的输入中。如果在路由属性中没有输入规范,应用程序会以第一个示例所示的方式期望属性。

    【讨论】:

      【解决方案3】:

      也许这就是你要找的东西:

      [Route("{v1}/{v2}/{v3}/{optionalParam?}")]
      public async Task<HttpResponseMessage> GetContent(string v1, string v2, string v3, string optionalParam)
      

      以及您操作签名中的任何其他参数都将被视为查询字符串。像这样:

      [Route("{v1}/{optionalParam?}")]
      public async Task<HttpResponseMessage> GetContent(string v1, string optionalParam, string queryString)
      

      您的请求将如下所示:

      https://localhost:44363/v1/optionalParam?queryString=HelloWorld
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2010-12-14
        • 2014-10-12
        • 2012-06-05
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        相关资源
        最近更新 更多