Получить возвращаемое строковое значение запроса URL, имеющее #

#asp.net-mvc #angularjs #razor #forms-authentication #query-string

#asp.net-mvc #angularjs #razor #формы-аутентификация #строка запроса

Вопрос:

Я работаю над приложением, которое использует Angular.js и ASP.NET MVC . Маршруты для angular.js содержат ‘#’. Некоторые страницы в приложении можно просматривать без необходимости входа в систему. Однако эти страницы содержат URL-адреса страниц в приложении, для входа в которые требуется, чтобы пользователь вошел в систему. Они выглядят как:

 <a href="~/#/shop/voucher/6bc1">Want this voucher?</a>
  

Поэтому, когда нажимаются эти ссылки, MVC forms authentication перенаправляет на страницу входа со строкой запроса возвращаемого URL, которая выглядит следующим образом:

 http://localhost:18030/signin?ReturnUrl=/#/shop/voucher/6bc1
  

Итак, на страницах входа, когда я пытаюсь просмотреть строку запроса, я получаю только ‘/’ для возвращаемого URL, поскольку это часть /. Я теряю оставшееся значение из-за #.

Если я пытаюсь URL-кодировать ссылку, # и другие символы ‘/’ кодируются, но затем маршрутизация путается, и я получаю 404 ошибки.

Есть ли способ получить доступ к полному строковому значению запроса с ‘#’ в нем? Я не уверен, почему проверка подлинности форм не кодирует #.

Ответ №1:

Фрагмент URL-адреса никогда не отправляется на сервер, поэтому здесь вам придется проявить немного творчества.

Один из способов, которым я решал эту проблему в прошлом, — использовать код на стороне клиента для изменения URL-адреса действия для входа в систему и добавления фрагмента в качестве параметра строки запроса.

 //Pulls out everything past the '#'
var fragment = $location.path();

$scope.fragmentParam = "amp;fragment="   fragment;
  

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

 public ActionResult Login(MyLoginInfo info, string returnUrl, string fragment){

    //Normal login code

    var redirectUrl = String.Format("{0}#{1}", returnUrl, fragment);    

    Redirect(redirectUrl);

}
  

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

Комментарии:

1. Спасибо! Ваш ответ заставил меня задуматься в правильном направлении. Получилось. 🙂