How to get Url Hash (#) from server side
我知道在客户端(javascript)你可以使用windows.location.hash但无论如何都无法从服务器端访问。
我们遇到过需要在ASP.Net帖子后面保留URL哈希的情况。由于浏览器默认情况下不会将哈希发送到服务器,唯一的方法是使用一些Javascript:
当表单提交时,抓取哈希值(
如果您需要对服务器执行某些操作,则可以在服务器上使用此值。如果需要,您甚至可以更改它。
在客户端的页面加载上,检查此隐藏字段的值。您将希望通过其包含的DIV找到它,因为将不知道自动生成的ID。是的,您可以使用.ClientID在这里做一些技巧但我们发现只使用包装器DIV更简单,因为它允许所有这些Javascript存在于外部文件中并以通用方式使用。
如果隐藏的输入字段具有有效值,请将其设置为URL哈希(
我们使用jQuery来简化字段的选择等等...总而言之,它最终只是一些jQuery调用,一个用于保存值,另一个用于恢复它。
提交前:
1 2 3 | $("form").submit(function() { $("input","#urlhash").val(window.location.hash); }); |
在页面加载:
1 2 3 4 | var hashVal = $("input","#urlhash").val(); if (IsHashValid(hashVal)) { window.location.hash = hashVal; } |
此外,当然要确保正确使用
RFC 2396第4.1节:
When a URI reference is used to perform a retrieval action on the
identified resource, the optional fragment identifier, separated from
the URI by a crosshatch ("#") character, consists of additional
reference information to be interpreted by the user agent after the
retrieval action has been successfully completed. As such, it is not
part of a URI, but is often used in conjunction with a URI.
(重点补充)
那是因为浏览器没有将该部分传输到服务器,抱歉。
可能唯一的选择是在客户端读取它并将其手动传输到服务器(GET / POST / AJAX)。
问候
阿图尔
您还可以看到如何使用后退按钮和浏览器历史记录
在马尔坎
只是为了排除你实际上没有尝试在GET / POST上看到片段并且实际上想要知道如何访问服务器端代码中的URI对象部分的可能性,它在Uri.Fragment下。 (MSDN文档)。
GET请求的可能解决方案:
新链接格式:
将此功能调用到控制器顶部或
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function redirect() { if (!empty($_GET['hash'])) { /** Sanitize & Validate $_GET['hash'] If valid return string If invalid: return empty or false ******************************************************/ $validHash = sanitizeAndValidateHashFunction($_GET['hash']); if (!empty($validHash)) { $url = './#' . $validHash; } else { $url = '/your404page.php'; } header("Location: $url"); } } |