#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. Спасибо! Ваш ответ заставил меня задуматься в правильном направлении. Получилось. 🙂