ASP.NET MVC Логин ReturnUrl всегда NULL? - PullRequest
56 голосов
/ 06 мая 2009

При использовании проверки подлинности с помощью форм в ASP.NET MVC при попытке входа на сайт он добавляет параметр ReturnUrl в строку запроса. Мой метод действия входа в систему принимает строку «returnUrl». Однако кажется, что строка returnUrl всегда равна нулю, даже если она явно находится в строке запроса. Любые мысли о том, почему это может иметь место или возможное решение?

Ответы [ 5 ]

119 голосов
/ 30 июля 2009

Это обычно происходит, когда вы используете одну общую форму входа, но вы явно указываете Controller и ActionMethod (который вызывает публикацию формы, но теряет строку запроса)

Просто чтобы уточнить, как должен выглядеть ваш код в BeginForm:

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })

РЕДАКТИРОВАТЬ : Это сделано так, как RickAnd упоминает в комментариях ниже. Однако он не позволяет шаблону пользовательского интерфейса находиться глубоко на сайте, нажимая LogOn, а затем возвращаясь на страницу, на которой вы были ранее, если это позволяет анонимным пользователям. Это часто запрашиваемый шаблон. Подход Дэвида Аллена к LogOff также отлично подходит для чистого перенаправления в LogOn.

23 голосов
/ 06 мая 2009

Может быть, вы не включили параметр ReturnURL в атрибут действия вашей формы входа, таким образом, отправляя URL-адрес без этого параметра?

7 голосов
/ 21 июля 2013

В основном, Asp.net MVC имеет некоторые скрытые функции. Например, когда вы передаете переменную «id» в действие контроллера, он интерпретирует «id» как идентификатор по умолчанию и помещает его в запрос браузера с передней косой чертой. Используя другое имя вместо «id», мы увидим «?» а не передняя черта. Из-за установки имени 'id' для метода RegisterRoutes для global.asax file.

В этой задаче вы создали собственный контроллер данных для контроллера, используя этот код:

using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}

Таким образом, Asp.net MVC игнорирует другие полезные данные для передачи в действие контроллера, и мы увидим returnUrl всегда null.

Хотя с помощью этого Asp.net MVC работает правильно и returnUrl монтируется:

using(Html.BeginForm())
{
//form fields in LogOn View
}

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

using(Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] }))
{
//form fields
}
3 голосов
/ 03 апреля 2010

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

   public ActionResult LogOff()
    {
        FormsService.SignOut();
        return Redirect(Request.UrlReferrer.ToString());
    }

Вы можете получить причуду и передать returnUrl и проверить его, если хотите переопределить это поведение. Но мне это не нужно. Это достигает желаемого результата. Вход в систему может работать аналогично. Возможно, есть способы использовать инфраструктуру MVC, чтобы сделать это для меня, но пока я не изучу их, это ОЧЕНЬ просто и надежно работает.

1 голос
/ 06 мая 2009

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

        public static MvcForm BeginForm(this HtmlHelper htmlHelper, string id)
    {
        string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;

        TagBuilder tagBuilder = new TagBuilder("form");

        tagBuilder.MergeAttribute("id", id);
        tagBuilder.MergeAttribute("action", formAction);
        tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true);

        HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
        httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));

        return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
    }

Сначала убедитесь, что вы установили URL-адрес для входа в web.config. Затем убедитесь, что ваша форма входа не содержит ничего подобного, например:

Вид:

Если вы укажете действие, вы всегда получите нуль для возвращаемого URL:

Контроллер:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...