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.7
和 true
.
但我不知道如何获得这些值。我可以检查单个方法中是否有特定参数吗?
有人可以帮忙吗?谢谢
您可以在下面看到两种调用 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
}
我正在尝试将多个参数传递给 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.7
和 true
.
但我不知道如何获得这些值。我可以检查单个方法中是否有特定参数吗? 有人可以帮忙吗?谢谢
您可以在下面看到两种调用 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
}