如何从服务器端获取Url哈希(#)
我知道在客户端(JavaScript),你可以使用windows.location.hash,但无法find从服务器端访问。
我们遇到了一种情况,我们需要在ASP.Net后期保留URL散列。 由于浏览器默认情况下不会将哈希发送给服务器,唯一的办法就是使用一些Javascript:
-
当表单提交时,抓取散列(
window.location.hash
)并将其存储在服务器端隐藏的input字段中将其放在一个ID为“urlhash
”的DIV中,以便稍后可以轻松find它。 -
在服务器上,你可以使用这个值,如果你需要做一些事情。 你甚至可以改变它,如果你需要。
-
在客户端加载页面时,检查这个隐藏字段的值。 您将希望通过它所包含的DIV来查找它,因为自动生成的ID不会被知道。 是的,你可以在这里用.ClientID做一些技巧,但是我们发现使用包装DIV更简单,因为它允许所有的Javascript生存在一个外部文件中并以通用的方式使用。
-
如果隐藏的input字段具有有效值,则将其设置为URL哈希(
window.location.hash again
设置window.location.hash again
)和/或执行其他操作。
我们使用jQuery来简化字段的select等…总而言之,它只是一些jQuery调用,一个用于保存值,另一个用于恢复它。
提交前:
$("form").submit(function() { $("input", "#urlhash").val(window.location.hash); });
在页面加载:
var hashVal = $("input", "#urlhash").val(); if (IsHashValid(hashVal)) { window.location.hash = hashVal; }
IsHashValid()
可以检查“ undefined
”或其他你不想处理的事情。
另外,当然,要确保使用$(document).ready()
。
RFC 2396第4.1节:
当使用URI引用对所标识的资源执行检索操作时,由交叉影线(“#”)字符与URI分离的可选片段标识符由用户代理在检索后解释的附加参考信息组成行动已经圆满完成 。 因此,它不是URI的一部分,但通常与URI结合使用。
(强调加)
这是因为浏览器不会将该部分传输到服务器,对不起。
可能唯一的select是在客户端读取它并手动将其传输到服务器(GET / POST / AJAX)。 问候Artur
你也可以看到如何玩Malcan的后退button和浏览器历史logging
只是为了排除这种可能性,你实际上并不想在GET / POST上看到这个片段,而是真的想知道如何访问你在服务器端代码中的那部分URI对象,它就在Uri.Fragment ( MSDN文档 )。
GET请求的可能解决scheme:
新的链接格式: http://example.com/yourDirectory?hash=video01
: http://example.com/yourDirectory?hash=video01
将此函数调用到控制器顶部或http://example.com/yourDirectory/index.php
:
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"); } }