首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET Core中将输入的OTP与生成的OTP匹配

在ASP.NET Core中将输入的OTP与生成的OTP匹配
EN

Stack Overflow用户
提问于 2022-04-13 09:45:01
回答 1查看 1.4K关注 0票数 1

我正在构建一个ASP.NET Core应用程序,当用户单击"Generate“时,屏幕上会显示一个4位数字的OTP,然后他必须在输入字段中输入该OTP,然后单击"Submit OTP”tp提交它。如果OTP是正确的,并在30秒内输入,那么用户将被显示一条成功消息,否则用户将得到OTP超时或不正确的异常。

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

我面临的问题是“主计长”。我已经将从"generateOtp“操作方法中生成的OTP值存储在”TempData“otp中,现在我尝试在"submitOtp”操作方法中使用它。但是它不起作用,我在这里做错了什么?

代码语言:javascript
复制
**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>
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-14 07:45:46

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

Keep函数用于保存TempData对象的数据,即使在读取该值之后也是如此,而Peek函数用于读取该值而不清除它。

将视图代码更改为:

代码语言:javascript
复制
<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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71855321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档