2011-04-06 123 views
47

我需要实现哈希值即网址应该是这样的哈希值:包括ASP.NET MVC URL路径

/家庭/索引/#创建

对于这个已添加路线:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/#{detail}", // URL with parameters 
    new { controller = "Login", action = "LogIn", detail =""} // Parameter defaults 
); 

在访问/home/index/#create,它被重定向到我的默认路由。

这怎么办?

+1

基于一些答案。我知道#hash,浏览器不会向服务器发送请求,但只有当URL在同一页面内第二次更改时才会发送请求。所以这个问题仍然有意义。想想如果用户收藏这个URL! #hash可能会引用评论锚或代表选定的菜单。我仍然在寻找一种正确的方式来实现这一点。 – CallMeLaNN 2011-06-03 02:18:49

回答

46

因为此值永远不会发送到服务器,所以无法在服务器上#符号之后获取该值。只有客户端的JavaScript有权访问这个,所以使用散列定义路由没有多大意义。

+11

它是有道理的。我的'#散列'用于记忆选定的菜单(我不想要cookie)。当用户点击一个菜单时,'#'改变并且AJAX请求到服务器去更新相应的内容。通过这种方式,用户能够使用所选菜单为页面添加书签,并且可以使用具有可读的'#menuname'的浏览器后退按钮。下次用户使用'#'浏览时,加载的页面已经具有选择的菜单而没有不必要的AJAX请求。我需要将哈希值绑定到路由数据中,因为每个'#'都可以被认为是不同的页面。 – CallMeLaNN 2011-06-03 02:37:28

+1

您可以使用JavaScript将其作为表单请求的一部分发送给服务器。 – 2011-10-24 17:22:33

5

当浏览器发出URL请求时,它不会在散列后向服务器发送任何内容。这条路线可能使您能够生成包含散列值的路由URL,但当用户导航到这样的URL时,无法执行任何操作服务器端。这只是网络的工作方式...

94

如上所述,没有办法使用路由来做到这一点。唯一可行的解​​决方案是在您的控制器的操作中重定向时将#片段附加到您的URL。例如。

return Redirect(Url.Action("Index", "Home") + "#create"); 
+8

IMO应该是被接受的答案。 OP问道:“这怎么能做到?”这是唯一给你一个合理解决方法的答案,而不是你为什么不能像OP最初想要的那样做。 – 2014-02-17 11:19:10

+1

我只花了20分钟试图弄清楚如何制作一个“返回View()”方法来允许散列参数或任何其他动作结果 - 这是完美的。好答案! – nocarrier 2014-08-11 03:55:47