Web API可选参数

Jos*_*osh 24 c# asp.net-web-api asp.net-web-api2

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

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

我用以下URI调用此方法:

  • 〜/ API /产品/过滤?APC = AA&XPC = BB
  • 〜/ API /产品/过滤?SKU = 7199123

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

apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;
Run Code Online (Sandbox Code Playgroud)

这似乎是一个黑客攻击,如果传递的值等于参数名称,则会出现问题.

有没有办法定义路线没有这种副作用?

Jos*_*osh 70

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

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

  • 〜/ API /产品/过滤?APC = AA&XPC = BB
  • 〜/ API /产品/过滤?SKU = 7199123

你会用:

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

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

  • 可空性和可选性是两个不同的概念,它们彼此无关(因为可以在参数列表之外使用可以为空的值).简单地声明一个参数`int?`将其标记为*nullable*,但它不是*optional*:您必须传递非空整数值或`null`.但是,添加`= null`是声明可选参数的默认值所需的语法.因此,`int?sku = null`是一个可以为空的`int`,其默认值为`null`(而不是其他一些整数值). (11认同)

Ali*_*uli 25

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

public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }
Run Code Online (Sandbox Code Playgroud)


小智 7

Sku 是一个整数,不能默认为字符串“sku”。请检查可选的 URI 参数和默认值