私が苦労している方法の1つは次のとおりです。
if (ModelState.IsValid)
{
var user = new User { UserName = model.Email, Email = model.Email };
IdentityResult result = null;
try
{
result = await this._userManager.CreateAsync(user, model.Password).Result;
}
catch (Exception ex)
{
}
if (result != null && result.Succeeded)
{
// not important code
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
メソッドにバグがあると思いますCreateAsync(TUser user, string passwor)
(Microsoft.AspNet.Identity、Microsoft.AspNet.IdentityCore.dll、v2.0.0.0)。パスワードバリデーターを使用してユーザーマネージャーを構成し、パスワードが検証されない場合、例外はなく (適切なパス)、IdentityResult
次のようになります。
Errors {string[1]}
- string[] {string[1]}
-- [0] "Passwords must have at least...."
ただし、nice IdentityResult の代わりに既存のユーザーを渡すと、メソッドはEntityValidationErrors
例外 (不正なパス) をスローします。上記のコードを try catch なしで元のコードに戻し、次のコードに本当に依存したいと思いますIdentityResult
。
if (ModelState.IsValid)
{
var user = new User { UserName = model.Email, Email = model.Email };
var result = this._userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// not important code
}
AddErrors(result);
}
CreateAsync()
メソッドをオーバーライドします。
public override Task<IdentityResult> CreateAsync(User user, string password)
{
Task<IdentityResult> result = null;
try
{
var ir = base.CreateAsync(user, password);
return ??;
}
catch (DbEntityValidationException ex)
{
var errors = ex.EntityValidationErrors
.Where(e => e.IsValid)
.SelectMany(e => e.ValidationErrors)
.Select(e => e.ErrorMessage)
.ToArray();
var ir = new IdentityResult(errors);
return ??;
}
return result;
}
ただし、タスクを返す方法も、問題を解決するという点でこれが正しい方向であるかどうかもわかりません。
私はこれを次のようにできると思いますが、値を返すだけの別のスレッドを使用することは、絶対に間違ったルートのようです。
result = Task.Factory.StartNew(() =>
{
return ir;
});