1

在我的注册HttpPost方法中

    [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 回答