не удалось получить полный URL-адрес после # с использованием строки запроса в asp.net c # [duplicate]

Раньше я думал, что создание объектов во время выполнения будет лучшим подходом. Теперь я менее уверен, так как вы теряете некоторые полезные функции, хотя это может стоить того, что было бы просто для предотвращения путаницы новичков. Недостатками этого являются:

1. Производительность

def foo(arg=something_expensive_to_compute())):
    ...

Если используется оценка времени вызова, тогда дорогая функция вызывается каждый раз, когда ваша функция используется без аргумента. Вы либо заплатили бы дорогостоящую цену за каждый вызов, либо должны вручную кэшировать значение извне, загрязняя пространство имен и добавляя многословие.

2. Принудительные связанные параметры

Полезный трюк заключается в привязке параметров лямбда к привязке current переменной при создании лямбда. Например:

funcs = [ lambda i=i: i for i in range(10)]

Возвращает список функций, возвращающих 0,1,2,3 ... соответственно. Если поведение изменено, они вместо этого привяжут i к значению времени вызова для i, поэтому вы получите список функций, которые все вернули 9.

Единственным способом реализации этого в противном случае было бы создать дальнейшее закрытие с привязкой i, то есть:

def make_func(i): return lambda: i
funcs = [make_func(i) for i in range(10)]

3. Introspection

Рассмотрим код:

def foo(a='test', b=100, c=[]):
   print a,b,c

Мы можем получить информацию о аргументах и ​​значениях по умолчанию с помощью модуля inspect, который

>>> inspect.getargspec(foo)
(['a', 'b', 'c'], None, None, ('test', 100, []))

информация очень полезна для таких вещей, как создание документов, метапрограммирование, декораторы и т. д.

Теперь предположим, что поведение по умолчанию может быть изменено так, что это эквивалентно:

_undefined = object()  # sentinel value

def foo(a=_undefined, b=_undefined, c=_undefined)
    if a is _undefined: a='test'
    if b is _undefined: b=100
    if c is _undefined: c=[]

Однако мы потеряли способность интроспекции и посмотрим, какие аргументы по умолчанию равны . Поскольку объекты не были построены, мы никогда не сможем их захватить, не называя функцию. Самое лучшее, что мы могли бы сделать, это сохранить исходный код и вернуть его как строку.

121
задан Jonas 13 December 2011 в 00:41
поделиться

6 ответов

У нас была ситуация, когда нам нужно было сохранить хэш URL-адресов через обратную связь ASP.Net. Поскольку браузер не отправляет хэш на сервер по умолчанию, единственный способ сделать это - использовать Javascript:

  1. Когда форма отправляется, возьмите хэш (window.location.hash) и сохраните его в скрытом поле ввода на стороне сервера. Поместите это в DIV с идентификатором «urlhash», чтобы мы могли легко найти его позже.
  2. На сервере вы можете использовать это значение, если вам нужно что-то с этим делать. Вы можете даже изменить его, если вам нужно.
  3. При загрузке страницы на клиенте проверьте значение этого скрытого поля. Вы захотите найти его в DIV, в котором он содержится, поскольку автогенерированный идентификатор не будет известен. Да, вы могли бы сделать некоторые обманы здесь с .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» или другие вещи, которые вы не хотите обрабатывать.

Кроме того, make конечно, вы, конечно, используете $(document).ready().

125
ответ дан DreamTeK 21 August 2018 в 21:43
поделиться
  • 1
    Отличное решение, но что такое запрос GET? – Warlock 1 June 2013 в 16:57
  • 2
    Без получения запросов это решение ничего. – Orhun Alp Oral 9 July 2013 в 21:31
  • 3
    @Chris. Но как вызов формы-отправки вызывается, когда вы просто вставляете URL-адрес в другом браузере (потому что это всего лишь запрос GET)? – KrishPrabakar 15 July 2013 в 10:22
  • 4
    быстрое решение. сделал мой день. благодаря! – Pete 22 February 2014 в 15:46
  • 5
    @Warlock, независимо от get / post, он будет работать, поскольку вы храните хэш в скрытом поле. – KMX 14 January 2015 в 04:45

Это потому, что браузер не передает эту часть на сервер, извините.

36
ответ дан Julien Oster 21 August 2018 в 21:43
поделиться

RFC 2396 раздел 4.1:

Когда ссылка URI используется для выполнения поиска по идентифицированному ресурсу, необязательный идентификатор фрагмента, отделенный от URI посредством символа crosshatch ("#"), состоит из дополнительной справочной информации, которая должна быть интерпретирована пользовательским агентом после успешного завершения поиска. Таким образом, он не является частью URI, но часто используется в сочетании с URI.

(выделено мной)

75
ответ дан Mauricio Scheffer 21 August 2018 в 21:43
поделиться
  • 1
    Я удивлен. Я много читал о SPA и не знал об этом. Итак, браузер отправляет так много конфиденциальной информации, но не хэш ??? Я думаю, что это должно произойти в будущем .. по крайней мере, как отдельный HTTP-заголовок. Это связано с: onebigfluke.com/2015/01/… – bodrin 12 February 2015 в 18:42

Просто, чтобы исключить возможность того, что вы на самом деле не пытаетесь увидеть фрагмент в GET / POST и на самом деле хотите узнать, как получить доступ к той части объекта URI, которая у вас есть в вашем серверном коде, она находится под Uri.Fragment ( Документы MSDN ).

3
ответ дан patridge 21 August 2018 в 21:43
поделиться
  • 1
    IE8, Chrome и Firefox все не отправят хэш на сервер; так что Uri.Fragment всегда является пустой строкой, если вы исследуете серверную часть Request.Url.Fragment (в соответствии с вышеприведенными ответами). – zcrar70 3 May 2011 в 19:50

Вероятно, единственный выбор - прочитать его на стороне клиента и перенести его вручную на сервер (GET / POST / AJAX). С уважением Артур

Вы также можете посмотреть, как играть с кнопкой «Назад» и историей браузера на Malcan

7
ответ дан user 21 August 2018 в 21:43
поделиться

Возможное решение для запросов 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");
    }
}
0
ответ дан webaholik 21 August 2018 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: