如何从服务器端获取Url Hash(#)

时间:2008-11-25 15:43:16

标签: asp.net url fragment-identifier

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

6 个答案:

答案 0 :(得分:130)

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

  1. 当表单提交时,抓取哈希值(window.location.hash)并将其存储在服务器端隐藏的输入字段中将其放入ID为“urlhash”的DIV中,这样我们就可以了可以在以后轻松找到。

  2. 在服务器上,如果您需要对其执行某些操作,可以使用此值。如果需要,您甚至可以更改它。

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

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

  5. 我们使用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()

答案 1 :(得分:78)

RFC 2396第4.1节:

  

使用URI引用对其执行检索操作时      标识资源,可选的片段标识符,分隔      由交叉阴影线(“#”)字符组成的URI由附加组成      参考信息由用户代理解释后      检索行动已成功完成。因此,事实并非如此      URI的一部分,但通常与URI结合使用。

(强调补充)

答案 2 :(得分:41)

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:3)

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

答案 5 :(得分: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");
    }
}