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;

这看起来像是一种黑客行为,如果传递的值与参数名称相等,就会出现问题。

有没有一种方法来定义没有这种副作用的路线?

170033 次浏览

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

我想通了。我使用了一个我过去发现的关于如何将查询字符串映射到方法参数的糟糕示例。

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

  • ~/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)
{ ... }
[Route("~/api/[Controller]/AutocompleteAdress/{input=}/{input2=}")]
public IEnumerable<string> GetAutocompleteAdress(string input, string input2)

它适合我(ASP.NET WEB API)。