我目前正在尝试向我的网站添加电子邮件确认,我遇到了一些问题。
我可以成功注册一个帐户,注册后,confirmToken会被放入我的数据库中,并且会发送一封电子邮件,其中包含查询字符串链接:http://www.example.com/RegistrationConfirmation?9ZPwZZrO-UmdpVpxXWjmRw当转到此链接时,控制器操作RegistrationConfirmation被调用,方法ConfirmAccount查询是否可以找到具有在网址中传递的确认令牌的用户。
调试时,我在此行中收到错误“序列包含多个元素”:Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);
我不确定会出现什么问题,因为令牌是唯一的,并且数据库中没有重复的令牌。
注册HttpPost:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterModel model)
{
string confirmationToken = CreateToken();
Account account = new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken);
if (DatabaseHandler.isUsernameDuplicate(account.Username))
{
// is duplicate // provide notification
}
else
{
Session["accountID"] = Repository.InsertAccount(new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email,false, confirmationToken));
// Email Logic
try
{
await client.SendMailAsync(message);
}
catch (Exception e)
{
ModelState.AddModelError("", "Problem sending email: " + e.Message);
}
return View("ConfirmEmail");
}
return View();
}
RegistrationConfirmation HttpGet:
[HttpGet]
[AllowAnonymous]
public ActionResult RegisterConfirmation(string Id)
{
if (ConfirmAccount(Id))
{
return RedirectToAction("ConfirmationSuccess");
}
return RedirectToAction("ConfirmationFailure");
}
ConfirmAccount方法:
private bool ConfirmAccount(string confirmationToken)
{
RecipeDbContext context = new RecipeDbContext();
Account user = context.Accounts.SingleOrDefault(u => u.ConfirmationToken == confirmationToken);
if (user != null)
{
user.IsConfirmed = true;
DbSet<Account> dbSet = context.Set<Account>();
dbSet.Attach(user);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
return true;
}
return false;
}
答案 0 :(得分:0)
删除SingleorDefault()并检查结果..您将知道它不重复,如果您想避免此错误,请使用FirstorDefault()。
答案 1 :(得分:0)
原来查询本身没有错,RegisterConfirmation HttpGet似乎没有得到confirmToken值,所以我添加了#34; Id = Request.QueryString.ToString();&#34;现在一切都很完美:)