允许使用ASP.NET MVC路由的字符串ID

时间:2017-02-10 16:41:56

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我设置了以下2个路由,并且在发送有效请求时它们正常工作。

config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");

我想测试一些不好的请求以确保响应是正确的。我试图在我的控制器中调用以下Action。

public HttpResponseMessage Get(string id)
{
    //output the id again
}

如果我致电localhost:80/users/123,我会收到有效的回复,并会输出123。当我尝试使用无效的ID时,例如,包含字母的字母失败并出现以下错误。

  

{“Message”:“找不到与请求URI匹配的HTTP资源   'http://localhost:80/users/d1g'。“,”MessageDetail“:”未找到任何操作   在控制器“用户”上匹配名称“d1g”。“}

我可以看到什么是错的。此请求应匹配第一个路由,而是匹配第二个路由。我有两个名为Get的方法。一个接受ID,另一个不需要ID。不需要ID的那个返回所有记录的列表。我遇到了很多麻烦,上面的路线就是我如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

通过删除约束来更新路由,通过操作更新路由以避免冲突,然后切换顺序。

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}"
    new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional }
);