ASP.NET MVC 传递多个可选参数 field=value

ASP.NET MVC Pass multiple optional parameters field=value

我正在尝试将多个参数传递给 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.

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

您可以在下面看到两种调用 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&v2=second param&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("{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

最简单的选择是简单地重载您的 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
}