将输入的 OTP 与 ASP.NET Core MVC 中生成的 OTP 匹配
Match the entered OTP with the Generated OTP in ASP.NET Core MVC
我正在构建一个 ASP.NET 核心 MVC 应用程序,当用户点击“生成 OTP”时,屏幕上会显示一个 4 位数的 OTP,然后他必须输入该 OTP输入字段并单击“提交 OTP” tp 提交它。如果 OTP 正确并在 30 秒内输入,则用户将看到一条成功消息,否则用户将收到 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>
}
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
。
我正在构建一个 ASP.NET 核心 MVC 应用程序,当用户点击“生成 OTP”时,屏幕上会显示一个 4 位数的 OTP,然后他必须输入该 OTP输入字段并单击“提交 OTP” tp 提交它。如果 OTP 正确并在 30 秒内输入,则用户将看到一条成功消息,否则用户将收到 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>
}
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
。