将输入的OTP与ASP.NET Core MVC中生成的OTP进行匹配



我正在构建一个ASP.NET Core MVC应用程序,当用户单击";生成OTP";则在屏幕上向他显示4位OTP,然后他必须在输入字段中输入该OTP;提交OTP";tp提交。如果OTP正确并且在30秒内输入,则会向用户显示成功消息,否则用户将收到OTP超时或不正确的异常。

我已经编写了生成OTP、发送和提交的控制器代码

我面临的问题是";控制器";。我已经存储了来自"OTP"的生成OTP的值;generateOp";"动作方法";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>
}

TempData仅在当前和后续请求期间工作。因此,当您提交它时,它是第三个请求,它将丢失存储的值。要持久化它,可以尝试使用TempDataKeepPeek函数。

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>

更多的细节你可以参考这里的答案。

如果您使用TempData超过三次请求,我建议您使用Session

最新更新