2016-06-30 9 views
2

ここに私の登録方法があります。私は登録メソッドを管理ツールに変更しました。管理ツールはif文なしで正常に動作します。しかし、それは私が既存のユーザーを探しているようには好きではありません。コントローラに既にユーザが存在するかどうかを確認するにはどうすればよいですか?

// POST: /Account/Register 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Register(RegisterViewModel model) 
{  
    if (ModelState.IsValid) 
    { 
     if(_context.Users.Contains(model.UserName))//Errors out here 
     { 
      var user = new ApplicationUser { UserName = model.UserName}; 
      user.UserName = model.UserName; 
      var result = await UserManager.CreateAsync(user, model.Password); 
      if (result.Succeeded) 
      { 
       await this.UserManager.AddToRoleAsync(user.Id, model.Name); 
       return RedirectToAction("Index","User"); 
      } 
     AddErrors(result); 
     } 
    } 
    return View(model); 
} 

答えて

5

代わりに試してみてください。

if(!_context.Users.Any(x => x.UserName == model.UserName)) 

は、条件が存在する場合、ユーザーにユーザー名がユーザー名が...どれを返すtrueまたはfalseと呼ばれていると仮定。

あなたのロジックは、とにかく後ろ向きだと思います。私はあなたが存在しない場合、私は上記のことをしているユーザーを作成したいと思う。

しかし、このためにUserManagerを使用する方が良いでしょう。あなたは(のUserManagerが1つを持っている、とあなたは別のものを作成)複数の競合DbContextsを作成していないので、それはすべてのためのUserManagerを使用するのが最適である理由

var user = await UserManager.FindByNameAsync(model.UserName); 
if (user != null) 
    ... 

理由があります。これは、あるコンテキストで作成されたオブジェクトが他のコンテキストで使用しようとする問題につながり、あらゆる種類の頭痛を引き起こします。

しかし、最も効率的な方法は、単にユーザーを試して作成し、成功または失敗の結果を確認することです。

var result = await UserManager.CreateAsync(...) 
if (result.Succeeded) 
    .... 

あなたは既に上記のことをしていますので、余分なチェックを最初に行う点は何ですか?

+0

私はその素敵なアプリケーションエラーを与える前にユーザーを追加しようとしたので、私はかなりそれを試そうとしていました – Skullomania

+0

@Skullomania - そうすべきではありませんが、もしそうなら、あなたは例外を捕まえることができました。それが例外をスローしている場合は、それを引き起こしている問題を修正し、回避する必要はありません。 –

+0

私は回避策としてこの例を使用していません。私はエラーを処理するためにそれを使用しています。このエラーは、重複したユーザーによって発生しています。一意の名前で新しいユーザーを追加するとエラーは発生しません – Skullomania

関連する問題