I have a controller with the following signature:
[Route("products/filter/{apc=apc}/{xpc=xpc}/{sku=sku}")]
public IHttpActionResult Get(string apc, string xpc, int? sku)
{ ... }
I call this method with following URIs:
The first URI works without issue. The second one has a strange side effect. Even though the default values for apc and xpc should be null when not provided, the parameters are actually their names. I can overcome this by adding the additional logic:
apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;
This seems like a hack, and would be problematic if value passed was ever equal to the parameter name.
Is there a way to define the Route without this side effect?
This question is related to
c#
asp.net-web-api
asp.net-web-api2
I figured it out. I was using a bad example I found in the past of how to map query string to the method parameters.
In case anyone else needs it, in order to have optional parameters in a query string such as:
you would use:
[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.
Sku is an int, can't be defaulted to string "sku". Please check Optional URI Parameters and Default Values
you need only set default value to parameters(you do not need the Route attribute):
public IHttpActionResult Get(string apc = null, string xpc = null, int? sku = null)
{ ... }
Source: Stackoverflow.com