2016-04-14 81 views
1

我正在嘗試向我的網站添加電子郵件確認,並且遇到一些問題。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; 
    } 

回答

0

刪除的SingleOrDefault()和檢查結果..你會了解它的不重複,如果你想避免這個錯誤,那麼使用FirstorDefault()。

+0

檢查結果,它不是重複的,如果我使用FirstOrDefault而不是SingleOrDefault它傳遞查詢並將IsConfirmed設置爲true,但對於錯誤的用戶 – Vexena

+0

我不知道你的數據庫,但是邏輯..如果它是給用戶匹配的確認令牌,如果該用戶是錯誤的,那麼它是你的錯誤..代碼沒有錯誤。問題是關於序列包含超過元素不是關於您的確認標記過程 –

+0

併發布我的結果context.Accounts.where(u => u.ConfirmationToken == confirmationToken).ToList(); –

0

原來查詢本身沒有什麼錯,RegisterConfirmation HttpGet似乎沒有得到confirmToken的值,所以我添加了「Id = Request.QueryString.ToString();」並且一切正在工作完美:)