1

私が苦労している方法の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;
});
4

1 に答える 1

2

method async、問題のタスクを作成し、句awaitで代替値を返すだけです。catch

public override async Task<IdentityResult> CreateAsync(User user, string password)
{
    try
    {
        return await base.CreateAsync(user, password);
    }
    catch (DbEntityValidationException ex)
    {
        var errors = ex.EntityValidationErrors
            .Where(e => e.IsValid)
            .SelectMany(e => e.ValidationErrors)
            .Select(e => e.ErrorMessage)
            .ToArray();
        return new IdentityResult(errors);
    }
}
于 2014-05-14T19:59:04.027 に答える