关于asp.net:如何从服务器端获取Url Hash(#)

How to get Url Hash (#) from server side

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


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

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

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

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

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

  • 我们使用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;
    }

    IsHashValid()可以检查"undefined"或您不想处理的其他内容。

    此外,当然要确保正确使用$(document).ready()


    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请求的可能解决方案:

    新链接格式:http://example.com/yourDirectory?hash=video01

    将此功能调用到控制器顶部或http://example.com/yourDirectory/index.php

    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");
        }
    }