【问题标题】:How to send data from one razor page to another?如何将数据从一个剃须刀页面发送到另一个页面?
【发布时间】:2019-09-03 13:13:02
【问题描述】:

我正在尝试将一些数据从一个剃须刀页面发送到另一个页面。对于我的场景,用户正在尝试注册一个帐户。当他们提交他们的信息时,他们会收到一个确认代码发送到他们的电子邮件(在这种情况下,“电子邮件”存储在 C:/ 中的文件中)然后当他们返回 web 应用程序输入代码并确认它然后是帐户已注册并被发送到下一页。我无法知道当前在 webapp 上操作的用户是什么。所以,在注册页面上,他们输入他们的信息,然后生成一个代码,然后他们被发送到一个“确认”页面,他们在那里输入代码但是当他们到达下一页时,我无法知道谁的确认码是正确的当前用户,我需要将刚刚注册的用户ID或实际确认码传递给确认页面吗?我认为您可以通过打开会话来保存用户信息,但我只想在他们的帐户完全注册并确认后开始会话。

我相信您可以在这种情况下使用 ViewData,但是当我尝试使用 ViewData 时,发送到下一页的对象为空并且没有我需要的信息

注册模型

public class RegisterModel : PageModel
    {
        readonly DatabaseContext _context;
        public IAccountService accountService;
        public RegisterModel(IAccountService _accountService, DatabaseContext context)
        {
            this.accountService = _accountService;
            _context = context;
        }

        [BindProperty]
        public VisUser _VisUser { get; set; }
        [BindProperty]
        public Email mails { get; set; }

        [Required(ErrorMessage = "Enter User Password"), DataType(DataType.Password)]
        public string ConfirmPassword { get; set; }

        // Generate a random password    
        public string RandomCode()
        {
            StringBuilder builder = new StringBuilder();
            builder.Append(RandomString(4, true));
            builder.Append(RandomNumber(1000, 9999));
            builder.Append(RandomString(2, false));
            return builder.ToString();
        }

        // Generate a random string with a given size    
        public string RandomString(int size, bool lowerCase)
        {
            StringBuilder builder = new StringBuilder();
            Random random = new Random();
            char ch;
            for (int i = 0; i < size; i++)
            {
                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
                builder.Append(ch);
            }
            if (lowerCase)
                return builder.ToString().ToLower();
            return builder.ToString();
        }

        // Generate a random number between two numbers    
        public int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }

        public ActionResult OnPost()
        {
            _VisUser.ConfirmationCode = RandomCode();
            var visUser = _VisUser;
            if (!ModelState.IsValid)
            {
                return Page();
            }
            if(visUser.UserPassword.CompareTo(ConfirmPassword) == 1)
            {

                visUser.UserId = 0;
                var result = _context.Add(visUser);
                _context.SaveChanges();

                SendEmail();

                TempData["ConCode"] = visUser.ConfirmationCode;

                return RedirectToPage("/Account/ConfirmationCode");
            }

            return Page();
        }

        public async Task SendEmail()
        {
            using(var smtp = new SmtpClient())
            {
                mails.To = _VisUser.Email;
                mails.From = "danny@Vispires.com";
                mails.Subject = "Registration Confirmation Code";
                mails.Body = _VisUser.ConfirmationCode;

                smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                smtp.PickupDirectoryLocation = @"c:\temp";
                var msg = new MailMessage
                {
                    Body = mails.Body,
                    Subject = mails.Subject,
                    From = new MailAddress(mails.From)
                };
                msg.To.Add(mails.To);
                await smtp.SendMailAsync(msg);

            }
        }
    }

确认码型号:

public class ConfirmationCodeModel : PageModel
    {

        readonly DatabaseContext _context;
        public IAccountService accountService;
        public ConfirmationCodeModel(IAccountService _accountService, DatabaseContext context)
        {
            this.accountService = _accountService;
            _context = context;
        }

        public string ConCode { get; set; }
        [Required(ErrorMessage = "Enter Confirmation Code")]
        public string ConfirmCode { get; set; }


        public ActionResult OnPost(string ConfirmCode)
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }
            if (ConCode == ConfirmCode)
            {
                //change isvalid and start session
                return RedirectToPage("/CreatePortfolio");
            }
            else
            {
                return Page();
            }
        }
    }

确认码查看:

@page
@using Visportfolio.Models @*namespace*@
@model Visportfolio.Pages.Account.ConfirmationCodeModel
@{
    ViewData["Title"] = "ConfirmationCode";
}

<h1>Code Authentication</h1>

<h3>Enter Code Here:</h3>

@{
    if (TempData["ConCode"] != null)
    {
        var ConCode = TempData["VisUser"] as string;
    }
}

<form method="post">
    <div class="row">
        <div class="col-md-4">
            <label asp-for="ConfirmCode"></label>
            <input asp-for="ConfirmCode" class="form-control" />
            <span class="alert-danger" asp-validation-for="ConfirmCode"></span>
        </div>
    </div>

    <input type="submit" value="Submit" class="btn btn-primary" />
</form>


在 RegisterModel > OnPost 方法的末尾,我创建了 ViewData 并保存了确认码。然后我尝试在确认码视图的顶部接收它。然后,当我尝试在该页面的 OnPost 中访问它时,确认代码为空。

【问题讨论】:

  • 尝试隐藏字段以在确认视图中保持 ConCode:

标签: c# html entity-framework


【解决方案1】:

在您的场景中,您想要注册用户并将确认码发送到其电子邮件或电话,将确认码存储在 ViewData、Session、ViewBag、TempData 或在剃刀页面之间传输它不是一个好主意。如果您的用户关闭其浏览器窗口,您将丢失注册码。您应该将此代码存储在分布式缓存或内存缓存中,并使用特定键(如 UserId、UserEmail 或 UserPhoneNumber)60 秒或更长时间。您也可以将此代码存储在数据库中,但将其存储在缓存中是更好的方法。

【讨论】:

  • 目前,确认码与 Validated 列一起存储在数据库中。当用户在数据库中注册他们的记录时,他们的用户名、密码、...、确认码、有效列。如果用户从未确认过他们的代码,那么他们的有效列仍然是 0,如果它被验证,那么有效列是 1。所以,我需要的只是匹配用户和确认码是 UserId。有没有办法传递刚刚尝试注册的用户的 UserId?
  • 如果您向您的用户发送电子邮件,您也可以发送标题为“点击确认”或其他内容的链接,并且在您的链接中是您网站的网址:YOURDOMAIN.COM/ConfirmPage?email=YOUSEREMAIL&code=SENTCODE" ,在 ConfirmPage 中,从查询字符串中获取数据并将其与存储的数据进行比较。如果没有,只需将 userId 或 useremail 以您的方式发送到 ConfirmPage(例如 ViewData、querystring 或其他)并将其设置为表单标签中的隐藏输入,以及激活码的空输入标签。
猜你喜欢
  • 2021-04-05
  • 2019-03-23
  • 2021-11-28
  • 2021-12-29
  • 1970-01-01
  • 2020-08-16
  • 2013-01-24
  • 2017-02-14
  • 2020-05-30
相关资源
最近更新 更多