Richard Deeming
RedirectToAction
возвращает ответ клиенту, сообщающий ему сделать новый запрос на указанное действие.
То ViewBag
содержимое не сохраняется между запросами. Все, что вы добавляете к ViewBag
перед возвратом ответ на перенаправление будет недоступен, когда браузер сделает новый запрос.
Здесь есть несколько вариантов:
1) Не используйте RedirectToAction
:
public ActionResult SenddOTP()
{
...
ViewBag.otp = strrandom;
return SendEmailtoUser();
}
private JsonResult SendEmailtoUser()
{
string OTP = ViewBag.otp;
bool result = SendEmail("user@gmail.com", "Hello", OTP);
return Json(result, JsonRequestBehavior.AllowGet);
}
Или:
public ActionResult SenddOTP()
{
...
return SendEmailtoUser(strrandom);
}
private JsonResult SendEmailtoUser(string OTP)
{
bool result = SendEmail("user@gmail.com", "Hello", OTP);
return Json(result, JsonRequestBehavior.AllowGet);
}
Браузер сделает один HTTP-запрос, и перенаправление не будет задействовано.
2) Используйте
TempData
место хранения:
public ActionResult SenddOTP()
{
...
TempData["otp"] = strrandom;
return RedirectToAction(nameof(SendEmailtoUser));
}
public JsonResult SendEmailtoUser()
{
string OTP = TempData["otp"] as string;
bool result = SendEmail("user@gmail.com", "Hello", OTP);
return Json(result, JsonRequestBehavior.AllowGet);
}
При этом все равно будут использоваться два HTTP-запроса.
NB: В этом случае вам нужно будет подтвердить, что
TempData
значение существовало, так как пользователь мог перейти непосредственно к
SendEmailToUser
действие без прохождения через
SenddOTP
действие.
Особое примечание 2: В слове "отправить" есть только одна буква "Д". :)