【问题标题】:MVC routing problem - trying to pick up the remainder after a hyphen in the routeMVC 路由问题 - 尝试在路由中的连字符后获取剩余部分
【发布时间】:2011-10-15 19:22:44
【问题描述】:

我创建了以下路线:

routes.MapRoute(
   "Notes 1", // Route name
   "{book}-{id}", // URL with parameters
   new { controller = "Notes", action = "Note", id = UrlParameter.Optional }
);

使用此 URL 和 MVC 路由检查器:

http://127.0.0.1:81/java-abcd-efg

id < efg
book < java-abcd
controller < Notes
action < Note

我的预期是那本书将包含“java”,而 id 将包含“abcd-efg”。有人可以解释什么是错的,为什么不是这样。

谢谢

【问题讨论】:

    标签: asp.net-mvc model-view-controller asp.net-mvc-3 asp.net-mvc-routing


    【解决方案1】:

    看起来路由引擎首先从右手端进行评估。我必须说你的路线设计不是很好。基本上具有相同的字符来分割路线的一部分以及路线的单个部分是一个很大的禁忌。您可以将连字符更改为其他内容吗?我会这样做:

    routes.MapRoute(
       "Notes 1", // Route name
       "{book}/{id}", // URL with parameters
       new { controller = "Notes", action = "Note", id = UrlParameter.Optional }
    );
    

    这会产生这个(仍然可以在 id 中保留连字符):

    http://127.0.0.1:81/java/abcd-efg
    
    id < abcd-efg
    book < java
    controller < Notes
    action < Note
    

    【讨论】:

    • 问题是我们被告知我们需要只使用连字符来进行搜索引擎优化。这有点道理,就好像你想在一本 java 书上找到信息一样,输入“java 抽象类”之类的东西是合乎逻辑的,它很适合我们的“java-abstract-classes”页面。我不确定这是否有帮助,但 {book} 的字符串将始终只有一个单词。
    • 抱歉,有段时间没有看到您的回复;我实际上在工作:-\。我看到乔治斯托克给了你一个相当全面的回应。很高兴您现在有足够的信息继续前进。
    【解决方案2】:

    问题是你没有告诉 MVC 期望不止一个破折号;所以它抓住了它找到的东西并试图以这种方式解析它。

    好吧,这对我们来说很糟糕。

    如果你知道你的路线永远是:

    {book}-{name}-{perhapsMoreName-{maybeEvenMore}
    

    然后我们可以处理它,但它需要在服务器端进行解析。

    相信我,使用斜线会容易得多。如果有人来找您并抱怨 SEO,请他们向您展示重要的确切位置(以及为什么斜线不起作用)。我并不是说他们错了,但是有很多,“我认为它与 SEO 一起工作”,而且很快就很烦人。

    我将为您提供两种解决方案。解决方案 1 将是我处理它(并为之奋斗)的方式,解决方案 2 将是解决您当前处理方案的特定问题的解决方案(我已经在实践中处理了解决方案 2,并且充其量它是非常 icky)。

    解决方案 1

    设置您的路线,类似于 Stack Overflow 设置他们的路线。这将使您的 SEO 人员拥有他神圣的 SEO,并且您会得到您想要的:没有溃疡。

    您的网址将变为:

    http://example.com/books/id/book-type-name

    routes.MapRoute("bookRoute",
        "books/{id}/{*bookName}",
        new { controller = "Notes", action = Show, id = "", bookName = "" }
    );
    

    然后,您可以使用 bookName 进行显示,但实际上不能使用它来获取任何代码。只需更改您的 Show 方法以按 ID 检索项目。

    解决方案 2

    此解决方案使用 ActionFilter 来拦截请求并解析出什么是什么。这是一个令人讨厌的解决方案,但它应该可以工作。

    wrote an answer that showed this solution 有另一个问题。它也适用于此,只需更改搜索类型以根据 URL 中的内容查询数据库。此外,路线必须位于路线的底部,否则它会先抓住它。所有标准免责声明都适用:使用参数化查询,或为您参数化它们的 ORM。

    【讨论】:

    • 非常感谢您的详细回复以及指向您其他帖子的链接。
    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多