在AttributeRouting中路由歧义

时间:2012-06-01 11:39:56

标签: c# asp.net-mvc-3 attributerouting

我正在尝试在两个不同的操作方法上创建两个不同的路径,如下所示:

[GET("/project/create")]
public ActionResult Create()

[GET("/project/{projectId}")]
public ActionResult Details(int projectId)

问题是当我导航到/ project / create时,我被路由到Details页面,因为projectId不是int,所以它失败了。

我意识到我可以将详细信息路由更改为/project/{projectId}/details之类的内容,但我希望它能以其他方式工作。

另外一个解决方案可能是使projectId成为一个字符串,如果projectId ==“create”,内部重定向到Create操作,但那会觉得很糟糕。

我正在使用AttributeRouting

2 个答案:

答案 0 :(得分:3)

如果您使用的是v2.2或更高版本的属性路由,则只需在项目ID上指定constraint

[GET("/project/{projectId:int}")]

如果在v2.2之前你可以使用正则表达式来达到同样的效果:

[GET("/project/{projectId(^[\\d]+$)}")]

但是在更一般的情况下,您可以通过设置属性的Precedence属性来指定控制器中路由的precedence

[GET("/project/create", Precedence = 1)]
public ActionResult Create()

[GET("/project/{projectId}", Precedence = 2)]
public ActionResult Details(int projectId)

答案 1 :(得分:0)

操作的顺序应自动设置优先级。因此,如果您的创建操作在详细信息之前,那么您应该没有问题。 Precedence属性最初是为了帮助那些具有路径的部分类的用户。

如果您无法正确订购路线或需要进一步控制,那么Rich的答案有很好的建议。