【问题标题】:Route ambiguity in AttributeRoutingAttributeRouting 中的路由歧义
【发布时间】:2012-06-01 11:39:55
【问题描述】:

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

[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

【问题讨论】:

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


    【解决方案1】:

    如果您使用 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)
    

    【讨论】:

    • 谢谢你修复它!我实际上尝试了你的第一个选项并认为它不起作用,但我没有使用 2.2,但你的正则表达式做到了。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-04
      • 2010-09-08
      • 1970-01-01
      • 2015-12-06
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多