Передача информации между контроллерами в ASP.Net-MVC - PullRequest
6 голосов
/ 16 февраля 2010

Это дубликат Как RedirectToAction в ASP.NET MVC без потери данных запроса


Привет, у меня возникла проблема, которая заставляет меня немного почесать голову. По сути, у меня есть страница входа в систему Login.aspx, в которой есть поля с именем пользователя и паролем, а также важный маленький флажок. Логин обрабатывается в методе AccountController Login. Код в настоящее время выглядит следующим образом:

[AcceptVerbs(HttpVerbs.Post)]
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
    Justification = 
        "Needs to take same parameter type as Controller.Redirect()")]
public ActionResult LogOn(string userName, string password, string returnUrl, 
    bool sendStoredInfo)
{
    if (!this.ValidateLogOn(userName, password)) {
        return View();
    }

    this.FormsAuth.SignIn(userName, false);

    if (!String.IsNullOrEmpty(returnUrl)) {
        return Redirect(returnUrl);
    } else {
        return RedirectToAction("Index", "Home");
    }
}

В основном, если строка return Redirect (returnUrl); срабатывает, затем он оказывается в другом контроллере, OpenIDController, и именно в этой ситуации значение bool sendStoredInfo становится важным. Но проблема в том, что у меня нет ссылки на него, когда я нахожусь в OpenIDController. Как я могу отправить это значение через?

Ответы [ 4 ]

14 голосов
/ 10 февраля 2015

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

Код в первом контроллере:

TempData["sendFlag"] = sendStoredInfo;
return RedirectToAction("LoginFailed");

Код во втором контроллере:

public ActionResult LoginFailed()
{
   bool sendFlag = TempData.ContainsKey("sendFlag")? TempData["sendFlag"]: false;
}
13 голосов
/ 16 февраля 2010

Изменить вызов на:

return RedirectToAction("LoginFailed", new { sendFlag = sendStoredInfo });

Подпись метода действия контроллера может выглядеть примерно так:

public ActionResult LoginFailed(bool sendFlag)
{
    ...
}
1 голос
/ 10 февраля 2015

Насколько мне хорошо известно, существуют четыре различных метода для обработки передачи данных между контроллерами в asp.net MVC.Это 1. ViewData 2. ViewBag 3. TempData и 4. Сеансы.Если вам может понравиться относительно хорошее объяснение помимо загружаемого примера, пожалуйста, посмотрите здесь

1 голос
/ 16 февраля 2010

Из-за характера перенаправлений вы можете выполнять только операцию GET.

Это означает, что вы должны передать параметр как часть строки запроса.

Таким образом, вы бы перенаправили на URL, как http://host/dir/page?sendStoredInfo=true

Затем вы можете включить его в сигнатуру вашего метода в другом контроллере или получить прямой доступ к нему, используя HttpRequest, предоставляемый HttpContext для операции.

Вы также можете вызвать RedirectToAction согласно предыдущему вопросу:

Как RedirectToAction в ASP.NET MVC без потери данных запроса

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