138

我知道在客户端(javascript)你可以使用 windows.location.hash 但无论如何都找不到从服务器端访问。我正在使用 asp.net。

4

6 回答 6

137

我们遇到过需要在 ASP.Net 回发中保留 URL 哈希的情况。由于浏览器默认情况下不会将哈希发送到服务器,因此唯一的方法是使用一些 Javascript:

  1. 当表单提交时,获取散列window.location.hashurlhash

  2. 在服务器上,如果您需要对它做一些事情,您可以使用这个值。如果需要,您甚至可以更改它。

  3. 在客户端上加载页面时,检查此隐藏字段的值。您将希望通过它包含的 DIV 找到它,因为自动生成的 ID 是未知的。是的,你可以在这里使用 .ClientID 做一些诡计,但我们发现只使用包装器 DIV 更简单,因为它允许所有这些 Javascript 存在于外部文件中并以通用方式使用。

  4. 如果隐藏的输入字段具有有效值,请将其设置为 URL 哈希 ( window.location.hash again) 和/或执行其他操作。

我们使用 jQuery 来简化字段的选择,等等……总而言之,它最终只是几个 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()得当。

于 2009-10-18T23:14:26.537 回答
85

[RFC 2396][1] 第 4.1 节:

当使用 URI 引用对已识别资源执行检索操作时,可选的片段标识符(由交叉影线(“#”)字符与 URI 分隔)包含在检索后由用户代理解释的附加参考信息动作已经顺利完成。因此,它不是 URI 的一部分,但通常与 URI 结合使用。

(强调添加)[1]:https ://www.rfc-editor.org/rfc/rfc2396#section-4

于 2008-11-25T19:27:15.703 回答
42

那是因为浏览器没有将该部分传输到服务器,对不起。

于 2008-11-25T15:45:55.370 回答
7

可能唯一的选择是在客户端读取它并手动将其传输到服务器(GET/POST/AJAX)。问候阿图尔

您还可以在 Malcan看到如何使用后退按钮和浏览器历史 记录

于 2008-12-30T11:16:13.100 回答
3

只是为了排除您实际上并没有尝试在 GET/POST 上查看片段并且实际上想知道如何访问您在服务器端代码中拥有的那部分 URI 对象的可能性,它位于 Uri.Fragment 下(MSDN 文档)。

于 2008-12-30T15:13:20.563 回答
0

GET 请求的可能解决方案:

新链接格式: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");
    }
}
于 2016-03-09T21:34:02.317 回答