Asp.net mvc MVC路由问题-尝试在路由中连字符后提取剩余的路由
我创建了以下路线:Asp.net mvc MVC路由问题-尝试在路由中连字符后提取剩余的路由,asp.net-mvc,model-view-controller,asp.net-mvc-3,asp.net-mvc-routing,Asp.net Mvc,Model View Controller,Asp.net Mvc 3,Asp.net Mvc Routing,我创建了以下路线: 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 <
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
http://127.0.0.1:81/java-abcd efg
id
我所期望的是,这本书将包含“java”,id将包含“abcd efg”。有人能解释一下什么是错的,为什么不是这样吗
谢谢看起来路由引擎是从右端开始计算的。我必须说你的路线设计不太好。基本上,使用相同的字符分割路线的各个部分以及在路线的单个部分内是一个很大的禁忌。您可以将连字符更改为其他字符吗?我会这样做:
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
问题在于,您没有告诉MVC期望不止一个破折号;所以它抓住了它发现的东西并试图用这种方式解析它
那对我们来说太糟糕了
如果您知道您的路线将始终是:
{book}-{name}-{perhapsMoreName-{maybeEvenMore}
然后我们可以处理这个问题,但是需要服务器端的工作来解析它
相信我,使用斜杠会容易得多。如果有人来找你抱怨SEO,请他们告诉你它的确切位置(以及为什么斜杠不起作用)。我并不是说他们错了,但有很多“我认为SEO就是这样”,这很快就会让人恼火
我将为您提供两种解决方案。解决方案1将是我处理它(并为之奋斗)的方式,解决方案2将是解决您当前处理方案中的特定问题的方法(我在实践中处理过解决方案2,充其量它非常讨厌)
解决方案1
设置您的路由,类似于堆栈溢出设置它们的路由。这将允许你的搜索引擎优化家伙有他的神圣搜索引擎优化,你会得到你想要的:没有溃疡
您的URL将更改为如下所示:
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拦截请求并解析出内容。这是一个令人讨厌的解决方案,但它应该有效
我想再问一个问题。这里也适用,只需更改搜索类型,根据URL中的内容查询数据库即可。此外,路线必须位于路线的底部,否则它会首先到达。所有标准免责声明都适用:使用参数化查询,或使用ORM为您参数化查询。问题是,我们被告知,为了SEO目的,只需使用连字符即可。这有点道理,就好像你想在一本java书籍上找到信息一样,键入类似“java抽象类”这样的内容是合乎逻辑的,它将非常适合我们的“java抽象类”页面。我不确定这是否有帮助,但是{book}的字符串总是一个单词;我实际上在工作:-\。我知道乔治·斯托克给了你一个相当全面的答复。很高兴你现在有足够的信息继续前进。非常感谢你的详细回复和你其他帖子的链接。
routes.MapRoute("bookRoute",
"books/{id}/{*bookName}",
new { controller = "Notes", action = Show, id = "", bookName = "" }
);