我正在构建一个ASP.NET Core应用程序,当用户单击"Generate“时,屏幕上会显示一个4位数字的OTP,然后他必须在输入字段中输入该OTP,然后单击"Submit OTP”tp提交它。如果OTP是正确的,并在30秒内输入,那么用户将被显示一条成功消息,否则用户将得到OTP超时或不正确的异常。
我编写了生成OTP、发送和提交OTP的控制器代码。
我面临的问题是“主计长”。我已经将从"generateOtp“操作方法中生成的OTP值存储在”TempData“otp中,现在我尝试在"submitOtp”操作方法中使用它。但是它不起作用,我在这里做错了什么?
**Controller**
namespace OTP_Sms_Verification.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
[HttpGet]
public IActionResult GenerateOtp()
{
return View();
}
[HttpPost]
public IActionResult SendOtp(Home home)
{
var hom = new Home();
home.num="01223456789";
home.len = home.num.Length;
home.otp = String.Empty;
home.otpDigit = 4;
for (int i = 0; i < home.otpDigit; i++)
{
do
{
home.getIndex = new Random().Next(0, home.len);
home.finalDigit = home.num.ToCharArray()[home.getIndex].ToString();
} while (home.otp.IndexOf(home.finalDigit) != -1);
home.otp += home.finalDigit;
}
TempData["otp"] = home.otp;
//ViewBag.otp = home.otp;
//ViewData["otp"] = home.otp;
//TempData["timestamp"] = DateTime.Now;
return RedirectToAction("GenerateOtp");
}
[HttpPost]
public IActionResult SubmitOtp([FromForm] int finalDigit)
{
int a = Convert.ToInt32(TempData["otp"]);
if (finalDigit == null) {
return NoContent();
}
else if ((DateTime.Now - Convert.ToDateTime(TempData["timestamp"])).TotalSeconds > 30)
{
return BadRequest("OTP Timedout");
}
else if (finalDigit.ToString() == Convert.ToString(a))
{
return Ok("OTP Accepted");
}
else
{
return BadRequest("Please Enter Valid OTP");
}
}
}
}
**Model**
@model OTP_Sms_Verification.Models.Home;
@{
ViewData["Title"] = "GenerateOtp";
}
<h1>GenerateOtp</h1>
<form method="post" asp-action="SendOtp" asp-controller="Home">
<br />
<input type="submit" value="GetOtp" class="btn btn-primary btn-lg"/>
<br />
<div>
@TempData["otp"]
</div>
</form>
@using (Html.BeginForm("SubmitOtp", "Home", FormMethod.Post))
{
<table cellpadding="0" cellspacing="0">
<tr>
<td>OTP: </td>
<td>
<input type="number" name="finalDigit">
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="SubmitOtp"/></td>
</tr>
</table>
}发布于 2022-04-14 07:45:46
TempData只在当前和随后的请求期间工作。因此,当您提交它时,它是第三个请求,它将丢失存储的值。要持久化,可以尝试使用TempData Keep或Peek函数。
Keep函数用于保存TempData对象的数据,即使在读取该值之后也是如此,而Peek函数用于读取该值而不清除它。
将视图代码更改为:
<form method="post" asp-action="SendOtp" asp-controller="Home">
<br />
<input type="submit" value="GetOtp" class="btn btn-primary btn-lg"/>
<br />
<div>
@TempData["otp"]
@{
TempData.Keep("otp"); //add this...
}
</div>
</form>您可以参考this answer here的更多细节。
如果您使用TempData超过三个请求,我建议您使用Session。
https://stackoverflow.com/questions/71855321
复制相似问题