Возникли проблемы с передачей в Asp.net MVC строки запроса в качестве параметра - PullRequest
2 голосов
/ 14 июня 2009

У меня есть страница входа. В моем файле web.config я настроил loginUrl так, что если пользователь пытается перейти на страницу «Авторизованные» и не авторизован, он будет перенаправлен на страницу входа.

Теперь я заметил, когда это происходит, и пользователь перенаправляется со страницы «Авторизованный», а URL-адрес страницы, с которой он перенаправляется, добавляется к URL-адресу входа в систему.

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

Так вот как будет выглядеть URL:

http://localhost:2505/CMS_Account/LogOn?ReturnUrl=%2fCMS_Home%2fIndex

Поэтому я пытаюсь захватить часть строки запроса ReturnUrl в качестве параметра в моем представлении.

Но я не могу понять, что это заняло работу.

Итак, я узнал, изменил ли я свою форму для входа в систему:

<% using (Html.BeginForm()) ........

Тогда я могу по какой-то причине захватить ReturnURl без проблем.

Однако, как у меня это сейчас, у меня есть это:

<% using (Html.BeginForm("Login","Authentication",FormMethod.Post,new { id = "frm_Login"})) .....

Как только я пытаюсь передать параметры в BeginForm, он прекращает захват ReturnUrl.

Я не знаю, почему это останавливается. Некоторые люди говорят, что это потому, что я использую маршрут по умолчанию, и почему-то, если вы ничего не добавляете в существа, он волшебным образом может определить ReturnUrl с URL-адресом по умолчанию.

Как только вы помещаете что-то в BeginForm, оно кажется немым, и вам нужно указать ему маршрут, чтобы сказать, что делать.

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

Так что я больше не знаю, что попробовать.

Что я пробовал

routes.MapRoute(
   "CMS_Account",  // Route name
   "CMS_Account/{action}/{ReturnUrl}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn",}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",  // Route name
   "CMS_Account/{action}/{ReturnUrl}",   // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",   // Route name
   "{controller}/{action}/{ReturnUrl}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", ReturnUrl = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",   // Route name
   "{controller}/{action}/{id}",  // URL with parameters
   new { controller = "CMS_Account", action = "LogOn", id = ""}  // Parameter defaults
);

routes.MapRoute(
   "CMS_Account",  // Route name
   "{controller}/{action}/", // URL with parameters
   new { controller = "CMS_Account", action = "LogOn"}  // Parameter defaults
);

Ответы [ 4 ]

6 голосов
/ 15 июня 2009

Вам не нужно менять маршруты. Крутая вещь с механизмом маршрутизации состоит в том, что, если вы добавите дополнительное значение маршрута, которое не объявлено в самом маршруте, механизм маршрутизации выбросит его в конце как переменную get.

например. Вы пытались поместить ReturnUrl в BeginFrom?

Контроллер, как предложил Деннис:

public ActionResult LogOn(string ReturnURL) {
    ViewData["ReturnURL"] = ReturnURL;
    return View();
}

Затем, по вашему мнению, вам нужно использовать перегрузку BeginForm (строковое действие, строковый контроллер, объект routeValues, метод FormMethod, объект htmlAttributes). Э.Г.

Html.BeginForm("Login",
               "Authentication",
               new { @returnUrl = ViewData["ReturnUrl"] },
               FormMethod.Post,
               new { @id = "frm_Login" })

HTHS, Charles

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

3 голосов
/ 14 июня 2009

Вам не нужно менять маршруты.

Самый простой способ получить параметр ReturnURL (или любой другой параметр строки запроса) - добавить его к вашему действию LogOn следующим образом:

public ActionResult LogOn(string ReturnURL) {
    ViewData["ReturnURL"] = ReturnURL;
    return View();
}
1 голос
/ 14 июня 2009

Когда вы конфигурируете форму в своем «текущем» состоянии, вы заставляете ее выполнять POST, но необходимые данные находятся в строке запроса.

Вы можете получить к нему доступ ControllerContext.HttpContext.Request.Querystring["ReturnURL"]

или ...

Добавьте ReturnURL как скрытое поле в форму и убедитесь, что ваш метод входа в систему, который вы будете публиковать, либо:

  • Принимает ReturnURL в качестве параметра
  • Выполняет Request.Form ["ReturnURL"]

для получения значения URL из формы HTML.

0 голосов
/ 14 июня 2009

Вы пытались использовать встроенную систему FormsAuthentications?

Если вы можете использовать это, вам не нужно реализовывать описанную вами функциональность.

Я не проверял это в MVC, но он должен работать:

FormsAuthentication.RedirectFromLoginPage(LogInAsUserName.Text, False)

FormsAuthentications - 4guysfromrolla

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...