1

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

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

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

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

我意识到我可以将 Details 路由更改为类似的东西,/project/{projectId}/details但我希望它以另一种方式工作。

另外一个解决方案可能是将 projectId 设为一个字符串,并在 projectId == "create" 的情况下在内部重定向到 Create 操作,但这会让人感觉很糟糕。

我为此使用AttributeRouting 。

4

2 回答 2

3

如果您使用的是 v2.2 或更高版本的属性路由,您可以简单地在项目 id 上指定一个约束:

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

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

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

然而,在更一般的情况下,您可以通过设置属性的属性来指定控制器中路由的优先级:Precedence

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

[GET("/project/{projectId}", Precedence = 2)]
public ActionResult Details(int projectId)
于 2012-06-01T11:46:08.113 回答
0

动作的顺序应该自动设置优先级。因此,如果您的 Create 操作在 Details 之前,那么您应该没有问题。Precedence 属性最初是为了帮助具有部分类的用户而开发的,每个类中都有路线。

如果您无法适当地订购路线,或者需要进一步控制,那么 Rich 的回答有很好的提示。

于 2012-06-01T16:55:52.717 回答