【发布时间】:2013-06-15 18:25:34
【问题描述】:
我猜答案是做多条路线,但是我们的路线列表开始变长了,所以我想看看这是否可以更优雅、更简单地表达出来。 :)
在我当前的示例中,我想创建一个具有多个选项的路由,其中一些元素是可变的,而另一些则不是。
所以一个示例 URI 将是:
http://localhost/api/schedules/10/instances/5
匹配的路由定义是:
api/schedules/{id}/instances/{item}
可能的端点是:
http://localhost/api/schedules/10 // returns schedule number 10
http://localhost/api/schedules/10/instances // returns all instances in schedule 10
http://localhost/api/schedules/10/instances/5 // returns 5th instance in schedule 10
似乎造成麻烦的是希望在两个可选参数之间有一个固定的关键字。我尝试了以下定义(和几个变体):
RouteTable.Routes.MapHttpRoute(
"RouteName",
"api/schedules/{id}/instances/{item}",
new {
id = RouteParameter.Optional,
instances = RouteParameter.Optional,
item = RouteParameter.Optional,
controller = "SomeController"
}
)
使用该路由,无法识别仅点击 /schedules/10,并且 /schedules/10/instances 和 schedules/10/instances/5 都返回 schedules/10/instances 结果。
这是否可能以某种方式实现,或者我应该制定两条路线,一条用于 /schedules/{id},一条用于 /schedules/{id}/instances/{item}?
附带说明一下,我正在开发一个 Web API 项目,但据我所知,这只是 MVC 解决方案的一个特定案例,因此我将两者标记为 MVC 和 Web API。
【问题讨论】:
-
基本上,你不能让像“instances”这样的文字URI段是可选的,所以“schedules/10”与模式不匹配。你可以定义两个路由,或者试试属性路由库(attributerouting.net)。顺便说一句,属性路由正在添加到 Web API 的 v.Next 中。
标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-mvc-routing asp.net-web-api-routing