1

私のRegisterHttpPostメソッドで

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                string ret=WebSecurity.CreateUserAndAccount(model.UserName, model.Password);

                if (WebSecurity.Login(model.UserName, model.Password))
                {}
            }
            return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }            
        return View(model);
    }

登録するユーザー名に関係なく、「その名前は既に使用されています。別のユーザー名を選択してください」という例外が常に発生します。エラーは、string ret=WebSecurity.CreateUserAndAccount(model.UserName, model.Password);ユーザー名とパスワードを DBtable に追加する行で発生しますが、その直後に例外がスローされます。

更新】私RegisterModelのルックスはこんな感じ

public class RegisterModel
{
    [Required]
    [Remote("IsUserAvailable", "UserExistsValidation")]
    [Display(Name = "User name")]
    [StringLength(30,MinimumLength=2)]
    public string UserName { get; set; }
}

IsUserAvailable方法UserExistsValidationControler

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class UserExistsValidationControler: Controller
{
    public JsonResult IsUserAvailable(string username)
    {
        if (!WebSecurity.UserExists(username))
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
        string suggestedUsername = string.Format(CultureInfo.InvariantCulture, "'{0}' is not available", username);

        for (int i = 0; i < 100; i++)
        {
            string candidate = username + i.ToString();
            if (!WebSecurity.UserExists(candidate))
            {
                suggestedUsername = string.Format(CultureInfo.InvariantCulture, "'{0}' is not available. Try {1}.", username, candidate);
                break;
            }
        }
        return Json(suggestedUsername, JsonRequestBehavior.AllowGet);
    }
}
4

1 に答える 1

1

WebSecurity.CreateUserAndAccount以下をせよ:

this.CreateUserRow(database, userName, values);
this.CreateAccount(userName, password, requireConfirmation);

2 つの操作がトランザクションに含まれていないため、ユーザー プロファイル テーブルにレコードが作成されました。最初にチェックがあります
。msdnは次のように説明しています。CreateAccount()

このメソッドを呼び出すと、メンバーシップ システムは、username で渡した名前と一致するユーザー プロファイル レコードが存在することを確認します。(このメソッドは、メンバーシップを初期化するために InitializeDatabaseConnection() メソッドを呼び出したときに、userTableName パラメーターで指定したテーブルと userNameColumn 列で指定した列を照会します。) 次に、ユーザーを使用して、メンバーシップ テーブルに新しいエントリを作成します。ユーザー プロファイル テーブル内の対応するレコードの ID。

接続設定に問題がある可能性がありますので、設定の確認から始めたほうがよいでしょう。

于 2013-03-11T17:20:50.220 に答える