Web API可选参数

时间:2016-07-07 15:06:56

标签: 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)
{ ... }

我用以下URI调用此方法:

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

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

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

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

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

4 个答案:

答案 0 :(得分:50)

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

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

  • 〜/ api / products / filter?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)
{ ... }

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

...
pstream::pstream() :leftMargin(),rightMargin(),topMargin(),bottomMargin(),tabSize(4),pageNumbers(false)
    {
        DWORD buffSize;
        _TCHAR* pPrinterName;
        GetDefaultPrinter(0, &buffSize);
        pPrinterName = new _TCHAR[buffSize]();
        GetDefaultPrinter (pPrinterName,&buffSize);
        defaultPrinter = pPrinterName;
        //Set the stream status
        streamStatus = (defaultPrinter == "")? FAIL : GOOD;
    }....

答案 3 :(得分:0)

[Route("~/api/[Controller]/AutocompleteAdress/{input=}/{input2=}")]
public IEnumerable<string> GetAutocompleteAdress(string input, string input2)

它对我有用(ASPNET WEBAPI)