【发布时间】: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