2016-04-14 4 views
1

現在、私のウェブサイトに確認メールを追加しようとしていますが、いくつかの問題が発生しています。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; 
    } 

答えて

0

SingleorDefaultを(削除)し、その結果をチェック..あなたが知っているでしょうその重複しないようにしてください。このエラーを回避したい場合は、FirstorDefault()を使用してください。

+0

結果をチェックし、重複していません。私がSingleOrDefaultの代わりにFirstOrDefaultを使用すると、クエリーを渡してIsConfirmedをtrueに設定しますが、間違ったユーザーの場合 – Vexena

+0

データベースについてはわかりませんが、 ..もしそれが確認トークンと一致するユーザを与えていると、そのユーザが間違っていればあなたの間違いです..コードに誤りはありません。質問にはあなたの確認トークンプロセスに関する要素以上のものが含まれていました –

+0

そして私にはcontext.Accounts.where(u => u.ConfirmationToken == confirmationToken)の結果を投稿してください。 –

0

問合せ自体に問題はありませんでしたが、RegisterConfirmation HttpGetはconfirmToken値を取得していないようでしたので、「Id = Request.QueryString.ToString();」を追加しました。すべてが完璧に今働いています:)

関連する問題