ChatGPT解决这个技术问题 Extra ChatGPT

Web API 可选参数

我有一个具有以下签名的控制器:

[Route("products/filter/{apc=apc}/{xpc=xpc}/{sku=sku}")]
public IHttpActionResult Get(string apc, string xpc, int? sku)
{ ... }

我使用以下 URI 调用此方法:

~/api/products/filter?apc=AA&xpc=BB

~/api/products/filter?sku=7199123

第一个 URI 没有问题。第二个有一个奇怪的副作用。尽管 apc 和 xpc 的默认值在未提供时应该为 null,但参数实际上是它们的名称。我可以通过添加额外的逻辑来克服这个问题:

apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;

这似乎是一种 hack,如果传递的值永远等于参数名称,那将是有问题的。

有没有办法在没有这种副作用的情况下定义路线?

您在路由模板中提供了默认值。为什么您会期望它们是 null
我认为 {sku=sku} 将查询字符串中的参数映射到方法参数。
您应该查看 documentation for attribute routing。它显示了如何使参数可选。

J
Josh

我想到了。我使用了一个我在过去发现的如何将查询字符串映射到方法参数的坏例子。

如果其他人需要它,为了在查询字符串中包含可选参数,例如:

~/api/products/filter?apc=AA&xpc=BB

~/api/products/filter?sku=7199123

你会使用:

[Route("products/filter/{apc?}/{xpc?}/{sku?}")]
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }

当这些类型已经有默认值时,必须为方法参数定义默认值似乎很奇怪。


我赞同你的想法 - It seems odd to have to define default values for the method parameters when these types already have a default.。检查了 MSDN als here 上的详细信息,但它没有谈论任何技术细节,说明为什么决定这样做。
可空性和可选性是两个不同的概念,它们彼此无关(因为可空值可以在参数列表之外使用)。简单地声明一个参数 int? 将其标记为 可为空,但它不是 可选:您必须传递非空整数值或 null。但是,添加 = null 是声明可选参数的默认值所需的语法。因此,int? sku = null 是一个可为空的 int,其默认值为 null(而不是其他一些整数值)。
A
Ali Rasouli

您只需将默认值设置为参数(您不需要 Route 属性):

public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }

i
iliketocode

Sku 是一个 int,不能默认为字符串“sku”。请检查Optional URI Parameters and Default Values


不推荐的解决方案,因为如果不是 null,您需要提供额外的验证逻辑来检查参数是否实际上是 int。如果您坚持使用 int?,框架会提供开箱即用的验证,您只需检查 ModelState...
i
iliketocode
[Route("~/api/[Controller]/AutocompleteAdress/{input=}/{input2=}")]
public IEnumerable<string> GetAutocompleteAdress(string input, string input2)

它适用于我(ASP.NET WEB API)。