Почему Request.QueryString ["ReturnUrl"] возвращает NULL, даже если он присутствует в URL? - PullRequest
9 голосов
/ 29 января 2010

(это более узкий вопрос)

В моем действии asp.net MVC я проверяю, есть ли значение ReturnUrl в URL.

Мой URL выглядит так:

http://localhost:56112/user/login?ReturnUrl=/user/settings

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

код:

if(Request.QueryString["ReturnUrl"] != null)
{

}

Отслеживая приложение, оно просто пропускает тело оператора if, т. Е. Оно равно NULL.

Как это можно объяснить?

Обновление

В контроллере, который проверяет, вошел ли пользователь в систему, у меня есть ActionFilter, который выглядит следующим образом:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        // some stuff
        string loginUrl = FormsAuthentication.LoginUrl + "/user/settings;

         context.Response.Redirect(loginUrl);
    }

Ответы [ 4 ]

3 голосов
/ 29 января 2010

Попробуйте отладить код - вы сможете увидеть в отладчике весь список параметров QueryString, чтобы вы могли увидеть, что вы его неправильно написали.

2 голосов
/ 01 августа 2012

Просто столкнулся с подобной проблемой сам.

Request.RawUrl правильный, в URL, отправленном в браузер, отсутствует QueryString. Проверьте View Source для страницы и проверьте URL-адрес атрибута action вашего элемента формы. Вы, вероятно, обнаружите, что QueryString отсутствует.

Вероятно, происходит то, что вы используете перегрузку @ Html.BeginForm, которая принимает параметр routeValues. Использование любой перегрузки с "routeValues" создаст новый URL-адрес маршрутизации и удалит все параметры строки запроса. В моем случае я хотел добавить атрибут enctype, и единственная перегрузка требует указания routeValues. Я полагаю, это недосмотр в MVC 3.

Однако вы все равно можете написать свой собственный тег формы старомодным способом. Глядя на исходный код для MVC 3, кажется, что базовая перегрузка для Html.BeginForm использует Request.RawUrl.

Попробуйте следующее:

<form action="@Request.RawUrl" method="post" enctype="multipart/form-data">
1 голос
/ 11 июля 2018

Я столкнулся с этой проблемой сам, и мне было сложно определить наиболее оптимальное решение, поэтому я решил добавить свой краткий опыт в разговор.

В режиме отладки я прокрутил все свойства запроса; в моем случае я нашел значение QueryString, которое я искал, в HttpContext.Request.UrlReferrer.Query. Кажется, причина этого в том, что я нажал на Html.ActionLink со страницы, которой принадлежало это значение QueryString, и это подтолкнуло меня к обработчику MVC ActionResult, который технически рассматривается как отдельная страница ( только что определенная HttpContext), даже если она не отображается как таковая на URL-адресе в браузере во время отладки.

Дальнейшие исследования показывают, что Microsoft предпочитает решение этой проблемы - просто передать свое значение по цепочке, когда вы вызываете обработчик ... но синтаксис для достижения этой цели, возможно, не так ясен так, как это должно быть. Вместо этого, анализ вашего значения из UrlReferrer, кажется, работает очень хорошо, даже если для достижения вашего значения требуется одна или две дополнительные строки кода. Например, самый базовый сценарий с одним значением, переданным в QueryString, может выглядеть примерно так:

String query = HttpContext.Request.UrlReferrer.Query;
String myValue = query.Split('=')[1];
0 голосов
/ 24 февраля 2017

У меня была похожая проблема, как у начинающего разработчика Asp.Net MVC. Проблема заключалась в форме входа в систему, которая отправляла форму своему конкретному контроллеру. Таким образом, пропущенные значения строки запроса очень нормальные. Потому что атрибут действия формы похож на action = "/ index / login"

Решение, которое я применил, заключается в добавлении скрытого поля в мою форму со значением из строки запроса. Это необходимо добавить в качестве параметра в ActionResult или модель.

@Html.Hidden("returnUrl", Request.QueryString["returnUrl"])

Другое решение - передать URL-адрес действия формы, например:

@using (Html.BeginForm("login", "contr", new {returnUrl = Request.QueryString["returnUrl"]})
...