我正在嘗試向我的網站添加電子郵件確認,並且遇到一些問題。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;
}
檢查結果,它不是重複的,如果我使用FirstOrDefault而不是SingleOrDefault它傳遞查詢並將IsConfirmed設置爲true,但對於錯誤的用戶 – Vexena
我不知道你的數據庫,但是邏輯..如果它是給用戶匹配的確認令牌,如果該用戶是錯誤的,那麼它是你的錯誤..代碼沒有錯誤。問題是關於序列包含超過元素不是關於您的確認標記過程 –
併發布我的結果context.Accounts.where(u => u.ConfirmationToken == confirmationToken).ToList(); –