我正在研究一些Web Api方法,并遇到了我们传递三种不同类型参数的场景:数字,字符串和字母数字值。
这是我的路由信息:
string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { action = alphanumeric }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { action = alphanumeric, id = numeric }
);
使用此路线信息,我可以获得字符串和字母数字值,但不能获得数字(通过相同的方法)。这是我的代码:
public IEnumerable<Deliveries> GetByAdvanced(string name)
{
var deliveries = ...
return deliveries;
}
e.g。示例Web API URL
现在,如果我只是为了处理int值而添加另一个方法,那么它的工作原理非常好。例如
下面的代码public IEnumerable<Deliveries> GetByAdvanced(int id)
{
var deliveries = ...
return deliveries;
}
这是接受这些值的正确方法吗?
答案 0 :(得分:3)
如果它只影响一种方法,那么您可以在控制器中尝试Attribute Routing而不是修改路由配置。
尝试类似下面的内容
[Route("Api/Deliveries/{id}/{StringVal}/{AlphaVal}")]
public IEnumerable<Deliveries> GetByAdvanced(int id, string StringVal, string AlphaVal)
{
var deliveries = ...
return deliveries;
}
答案 1 :(得分:0)
查看您的示例Web API网址,他们都应该工作
我使用以下配置创建了两个简单的新Web项目:
1)MVC4,Web Api和.NET 4
2)MVC 5,Web Api 2.2和.NET 4.5.1
我使用了与您提供的相同的路由和控制器中的相同操作方法,并且所有示例执行都正常工作。如何查看整个web api配置文件?您是否已在操作方法或控制器上定义了一些其他路由,但您没有向我们展示?
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$"; string numeric = @"^\d+$"; config.Routes.MapHttpRoute( name: "DefaultApiControllerActionName", routeTemplate: "api/{controller}/{action}/{name}", defaults: null, constraints: new { action = alphanumeric } ); config.Routes.MapHttpRoute( name: "DefaultApiControllerActionId", routeTemplate: "api/{controller}/{action}/{id}", defaults: null, constraints: new { action = alphanumeric, id = numeric } ); } }
控制器:
public class DeliveryController : ApiController { public string GetByAdvanced(string name) { return name; } }
BTW。为什么要为动作名称指定约束?