Вопрос или проблема
Я немного запутался. Я думал, что при использовании TempData
объект должен быть очищен, если его прочитали. Я не совсем понимаю, почему мне нужно напрямую вызывать функцию Remove()
, когда я выполняю RedirectToAction
, если я (по крайней мере) очищаю TempData
.
Вот код, который я использую, и любая помощь, конечно, приветствуется. Если такое поведение имеет место, я могу просто использовать Session.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ForgetPassword(Models.Portal.ForgetPasswordModel forgetPasswordModel)
{
if (ModelState.IsValid)
{
int forgetAttemptCounter = TempData[ConstLibrary.ForgetPasswordAttempt] == null ? 1 : (int)TempData[ConstLibrary.ForgetPasswordAttempt];
int maxCounter = 5;
if (forgetAttemptCounter <= maxCounter)
{
bool useEmail = Helper.Validation.IsValiEmailAddress(forgetPasswordModel.AccountName);
if (forgetPasswordModel.ForgetPasswordReset == Models.Portal.ForgetPasswordReset.Success)
{
TempData.Remove(ConstLibrary.ForgetPasswordAttempt);
return RedirectToAction("ResetPassword", "Portal", new Models.Portal.ResetPasswordModel());
}
else
{
TempData[ConstLibrary.ForgetPasswordAttempt] = (int)TempData[ConstLibrary.ForgetPasswordAttempt] + 1;
}
}
else
{
TempData[ConstLibrary.ForgetPasswordAttempt] = maxCounter + 1;
ViewBag.ShowForgetPasswordError = true;
return View(forgetPasswordModel);
}
}
ViewBag.ShowForgetPasswordError = true;
return View(forgetPasswordModel);
}
Ответ или решение
Проблема с очисткой TempData в ASP.NET MVC
Ваша путаница с использованием TempData
в ASP.NET MVC является распространенной, и многие разработчики сталкиваются с подобными вопросами. Позвольте мне объяснить логику работы TempData
, а также предложить некоторые рекомендации для решения вашей проблемы.
Что такое TempData?
TempData
— это механизм хранения временных данных, который предназначен для передачи информации между действиями контроллера. Когда вы записываете объект в TempData
, он хранится только до следующего запроса (или до тех пор, пока не будет прочитан). Основной особенностью является то, что данные в TempData
очищаются автоматически в момент их чтения, но это относится лишь к тем объектам, которые были прочитаны — если вы не считаете данные в TempData
, они остаются доступными в следующих запросах.
Поведение TempData при редиректе
Когда вы вызываете RedirectToAction
, MVC создает новый HTTP-запрос, и в этом запросе данные из TempData
могут не очищаться, если они не были считаны в предыдущем запросе. В вашей кодовой базе вы используете TempData
следующим образом:
TempData[ConstLibrary.ForgetPasswordAttempt] = (int)TempData[ConstLibrary.ForgetPasswordAttempt] + 1;
Если это выражение не вызывается побочным эффектом (например, при чтении значения через TempData
), данные останутся в TempData
даже после редиректа. В вашем случае, если условия не выполняются и вы не читаете данные перед редиректом, они будут доступны в следующем запросе.
Почему вы должны использовать Remove?
Метод TempData.Remove()
позволяет вам вручную удалить объект из TempData
. Это полезно в тех случаях, когда вы хотите быть уверены, что данные больше не доступны после определенного действия. В коде, который вы предоставили, вы вызываете TempData.Remove()
только когда forgetPasswordModel.ForgetPasswordReset
успешен, и этот метод действительно следует вызывать до RedirectToAction
, чтобы избежать нежелательного поведения в следующих запросах.
Рекомендации по решению проблемы
-
Чтение TempData: Убедитесь, что вы читаете
TempData
до того, как будете его изменять или вызыватьRedirectToAction
. Это гарантирует, что данные будут очищены согласно ожидаемому поведению.int forgetAttemptCounter = TempData[ConstLibrary.ForgetPasswordAttempt] as int? ?? 0;
-
Удаление TempData: Если вы хотите вручную контролировать, когда данные должны удаляться, и избежать случайных оставшихся значений в
TempData
, вызывайтеRemove()
в нужных местах. -
Переход на Session: Если вам необходимо хранить данные более длительный период (дольше чем один запрос), и если вы не хотите беспокоиться о их удалении, используйте
Session
. Однако помните о том, что данные вSession
живут до тех пор, пока не будут явно очищены или истечет тайм-аут сессии. -
Логирование и отладка: Убедитесь, что вы логируете состояния вашего
TempData
в разных частях кода. Это не только поможет вам понять, почему данные не очищаются, но и может быть полезным для обнаружения других потенциальных проблем в вашем коде.
Заключение
Понимание поведения TempData
и правильное управление его состояниями — ключ к успешной разработке приложений на ASP.NET MVC. Если использование TempData
кажется вам слишком сложным или вы хотите более долгосрочное хранилище данных, действительно стоит рассмотреть возможность использования Session
. Надеюсь, это объяснение помогло вам разобраться в вашей проблеме. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!