C# 不更改URL的自定义路由

C# 不更改URL的自定义路由,c#,asp.net-mvc-4,asp.net-mvc-routing,C#,Asp.net Mvc 4,Asp.net Mvc Routing,我有一个控制器和一个视图,在我传递ID时返回书本信息,例如: /Content/Index?id=1 现在,我想让它成为最终用户的友好URL。例如: 图书/图书名称(Id 1映射到的图书的名称) 因此,我在global.asax中添加了一个路由值,如下所示: route.maprRoute(name:"custom", url:"Books/{bookname}", defaults: new {controller = "bookMap", action ="index"} 在“BookM

我有一个控制器和一个视图,在我传递ID时返回书本信息,例如:

/Content/Index?id=1
现在,我想让它成为最终用户的友好URL。例如: 图书/图书名称(Id 1映射到的图书的名称)

因此,我在global.asax中添加了一个路由值,如下所示:

route.maprRoute(name:"custom", url:"Books/{bookname}",
defaults: new {controller = "bookMap", action ="index"}
在“BookMap”控制器中,我获取bookname并将其转换为ID(即1) 并通过将ID作为参数传递,对内容/索引执行重定向操作。
这个很好用。但问题是我想在重定向到视图后保留友好名称。现在它变为Content/Index?id=1。但我想保留友好的URL,即Books/BookName。如何实现这一点请参见。

您可以使用
HttpContext.RewritePath(url)
在“内部”执行重定向,以保留外部url。使用此选项代替
重定向操作
。但是请注意,MVC框架目前还不支持它,因此实现起来有点“不方便”。

您应该为此更改路径:

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

重定向的目的是不复制“BookMap”控制器中的代码。我希望“内容”控制器生成视图。好的,谢谢。但你认为搜索引擎在识别这位朋友时会有问题吗URL@pili-这个问题与搜索引擎优化无关。这就是你如何完成你所要求的。就SEO而言,这取决于你。我同意,因为MVC不支持它,所以它背后应该有一个合理的理由。所以我只是在检查这是一个技巧还是一个正确的方法。如果这是一种合适的方式,我就不需要担心SEO。这是一种合适的方式,只是MVC不支持“开箱即用”的方式。使用起来很好,但是MVC不鼓励直接操作
HttpContext
HttpResponse
对象。那么,该操作的返回类型是什么呢。public ActionResult Index(){//return rewritepath}谢谢。id=@“\d+”这是一个约束,顺便说一句,bookname不应该是可选的url参数。就像您可以实现/book/{id}或/book/{name}/{id}一样