Response.Redirect с использованием ~ Path - PullRequest
27 голосов
/ 28 августа 2008

У меня есть метод, при котором я хочу перенаправить пользователя обратно на страницу входа, расположенную в корне моего веб-приложения.

Я использую следующий код:

Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());

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

Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());

но этот код находится на главной странице и может быть выполнен из любого уровня папки. Как мне обойти эту проблему?

Ответы [ 3 ]

66 голосов
/ 28 августа 2008

Я думаю, вам нужно отбросить "~ /" и заменить его просто "/", я считаю / это корень

ОСТАНОВИТЕСЬ ПРАВИЛЬНО! :-), если вы не хотите жестко закодировать свое веб-приложение, чтобы оно могло быть установлено только в корне веб-сайта.

"~ /" - это правильная вещь для использования, но причина того, что ваш исходный код не работал должным образом, заключается в том, что ResolveUrl (который используется внутри Redirect) сначала пытается выяснить, является ли путь, по которому вы проходите, абсолютным URL (например, «**http://server/**foo/bar.htm" в отличие от« foo / bar.htm ») - но, к сожалению, он делает это просто поиск символа двоеточия ':' в указанном вами URL-адресе. Но в этом случае он находит двоеточие в URL-адресе, указанном вами в значении строки запроса ReturnPath, что вводит его в заблуждение - поэтому ваш ~ / / получить разрешение.

Исправление состоит в том, что вы должны кодировать URL-адрес значением ReturnPath, которое экранирует проблемный символ ':' вместе с любыми другими специальными символами.

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));

Кроме того, я рекомендую, чтобы вы (или кто-либо другой) никогда не использовали Uri.ToString - потому что он дает удобочитаемую, более «дружественную» версию URL - не обязательно правильную (она не затрагивает). Вместо этого используйте Uri.AbsoluteUri - вот так:

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
0 голосов
/ 12 октября 2018

вы можете сначала разрешить URL Response.Redirect ( "~ / Login.aspx); и добавьте параметры после разрешения.

0 голосов
/ 28 августа 2008

Как насчет использования

Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));
...