現在、私のウェブサイトに確認メールを追加しようとしていますが、いくつかの問題が発生しています。MVC電子メール確認(シーケンスに複数の要素が含まれています)
登録時に確認トークンがデータベースに保存され、クエリ文字列リンク: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を使用すると、クエリーを渡してIsConfirmedをtrueに設定しますが、間違ったユーザーの場合 – Vexena
データベースについてはわかりませんが、 ..もしそれが確認トークンと一致するユーザを与えていると、そのユーザが間違っていればあなたの間違いです..コードに誤りはありません。質問にはあなたの確認トークンプロセスに関する要素以上のものが含まれていました –
そして私にはcontext.Accounts.where(u => u.ConfirmationToken == confirmationToken)の結果を投稿してください。 –