我有一个具有以下签名的控制器:
[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
?
我想到了。我使用了一个我在过去发现的如何将查询字符串映射到方法参数的坏例子。
如果其他人需要它,为了在查询字符串中包含可选参数,例如:
~/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)
{ ... }
当这些类型已经有默认值时,必须为方法参数定义默认值似乎很奇怪。
您只需将默认值设置为参数(您不需要 Route 属性):
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }
Sku 是一个 int,不能默认为字符串“sku”。请检查Optional URI Parameters and Default Values。
null
,您需要提供额外的验证逻辑来检查参数是否实际上是 int
。如果您坚持使用 int?
,框架会提供开箱即用的验证,您只需检查 ModelState
...
[Route("~/api/[Controller]/AutocompleteAdress/{input=}/{input2=}")]
public IEnumerable<string> GetAutocompleteAdress(string input, string input2)
它适用于我(ASP.NET WEB API)。
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
(而不是其他一些整数值)。