2016-06-08 2 views
1

Так в том же контроллере у меня есть способ Войти Действие, как это:Переходит ли от одного метода действий к другому методу действия, очищает переменные класса?

public ActionResult Login() 
    { 

     LoginModel model = this.LoginManager.LoadLoginPageData(); 
     this.ForgotPasswordMethod = model.ForgotPasswordMethod; 
     return View(model); 
    } 

Обратите внимание, я установил переменную там: ForgotPasswordMethod

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

public ActionResult ForgotPassword() 
{ 
    if (!string.IsNullOrWhiteSpace(this.ForgotPasswordMethod) && this.ForgotPasswordMethod.Trim().ToUpper() == "TASKS") 
     return View(); 

    return null; //todo change later. 
} 

Примечание Я попытался прочитать значение ForgotPasswordMethod, но это было NULL, но это не равно нулю, когда я нахожусь в Login() method. Итак, что мне делать?

+0

Вы можете использовать 'TempData'. –

+1

Каждый раз, когда действие MVC обрабатывает запрос, создается новый экземпляр контроллера. Объект, который вы получили, когда был вызван логин, - это не то же самое, что и при вызове ForgotPassword. он не имеет статуса как http. Если вы поместите метод конструктора с точкой останова в контроллере и отлаживаете, вы увидите, что он будет вызываться каждый раз. – repeatdomiau

ответ

2

ASP.NET MVC был создан для возврата обратно в более чистый, более простой веб-мир, построенный на основе HTTP, который является апатридом, а это означает, что нет «памяти» того, что произошло ранее, если вы специально не используете технику, которая обеспечивает иное.

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

Как вы «исправляете» это? У вас есть множество вариантов, в зависимости от ваших потребностей:

  • Отдайте значение клиенту и отправьте его обратно на второй метод ActionResult.
  • Сохраните это значение как заголовок и проверьте этот заголовок.
  • Сохраните значение в файле cookie и проверьте файл cookie.
  • Сохраните значение в сеансе.
  • Сохраните значение в базе данных.
  • Сохраните значение в статическом словаре.
0

что, если вы храните forgotpasswordmethod в Viewbag как

public ActionResult Login() 
{ 
    LoginModel model = this.LoginManager.LoadLoginPageData(); 
    Viewbag.ForgotPasswordMethod = model.ForgotPasswordMethod; 
    return View(model); 
}  

затем в ссылке на вашей странице вы можете передать значение из ViewBag

<a [email protected]("ForgotPassword", "Name of your Controller", new { methodName = ViewBag.ForgotPasswordMethod })>Forgot Password</a> 

Изменить ваш forgotpassword к

public ActionResult ForgotPassword(string methodName) 
{ 
    if (!string.IsNullOrWhiteSpace(methodName) && methodName.Trim().ToUpper() == "TASKS") 
    return View(); 

    return null; //todo change later. 
} 
Смежные вопросы