MVC电子邮件确认(序列包含多个元素)

问题描述:

我正在尝试向我的网站添加电子邮件确认,并且遇到一些问题。MVC电子邮件确认(序列包含多个元素)

我可以成功注册一个帐户,注册时将confirmationToken放入我的数据库中,并通过查询字符串链接发送一封电子邮件:http://www.example.com/RegistrationConfirmation?9ZPwZZrO-UmdpVpxXWjmRw当此链接控制器操作时RegistrationConfirmation被调用并且方法ConfirmAccount执行查询以查看我们是否可以找到具有在url中传递的确认标记的用户。

调试时出现错误“序列包含多个元素”在这条线: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; 
    } 

删除的SingleOrDefault()和检查结果..你会了解它的不重复,如果你想避免这个错误,那么使用FirstorDefault()。

+0

检查结果,它不是重复的,如果我使用FirstOrDefault而不是SingleOrDefault它传递查询并将IsConfirmed设置为true,但对于错误的用户 – Vexena

+0

我不知道你的数据库,但是逻辑..如果它是给用户匹配的确认令牌,如果该用户是错误的,那么它是你的错误..代码没有错误。问题是关于序列包含超过元素不是关于您的确认标记过程 –

+0

并发布我的结果context.Accounts.where(u => u.ConfirmationToken == confirmationToken).ToList(); –

原来查询本身没有什么错,RegisterConfirmation HttpGet似乎没有得到confirmToken的值,所以我添加了“Id = Request.QueryString.ToString();”并且一切正在工作完美:)