2014-02-19 61 views
1

我有一个控制器,当我通过ID返回图书信息视图,例如:自定义路由,而不改变URL

/Content/Index?id=1 

现在我想使这是一个友好的URL到最终用户。对于如: 书籍/ BOOKNAME

所以我在Global.asax中添加的路由值(书编号1映射到的名称):

route.maprRoute(name:"custom", url:"Books/{bookname}", 
defaults: new {controller = "bookMap", action ="index"} 
在“BookMap”

控制器我得到的bookname并将其转换为ID(即1) ,并通过传递ID作为参数对Content/Index执行redirectionToAction。 这工作正常。但问题是我想在重定向到视图后保留友好名称。现在它更改为Content/Index?id = 1。但是我想保留友好的URL,即书籍/书名。我如何实现这个请求。

+0

重定向的目的是为了避免重复的代码在“BookMap”控制器。我想让“内容”控制器生成视图。 – pili

回答

0

您可以使用HttpContext.RewritePath(url)做一个“内部”的重定向来保存外部URL。用这个代替RedirectToAction。但是请注意,目前MVC框架没有适当支持它,所以实施起来会有点“黑客”。

+0

好的,谢谢。但是你认为搜索引擎在识别这个朋友URL时会遇到问题: – pili

+0

@pili - 这个问题不是关于SEO。这就是你如何完成你所要求的。在SEO方面,这取决于你。 – Haney

+0

我同意,由于它在MVC中不受支持,因此应该有一个有效的理由。所以我只是在检查它是一种做法还是一种正确的方法。如果这是一种正确的方式,我不需要担心搜索引擎优化。 – pili

0

你应该改变你的路线是:

routes.MapRoute(
     "Books", 
     "book/{bookname}/{bookid}", 
     new { controller = "book", action = "Index", bookname = UrlParameter.Optional }, 
     new { id = @"\d+" } 
    ); 
+0

谢谢。这是做什么id = @“\ d +” – pili

+0

这是一个约束,顺便说一句,bookname不应该是一个可选的url参数。喜欢它可以实现/ book/{id}或/ book/{name}/{id} – antao