如何在mvc中使用自定义成员身份添加更多自定义字段?

Neo*_*Neo 7 asp.net asp.net-mvc membership-provider asp.net-mvc-3 asp.net-mvc-2

我已覆盖成员资格方法以创建自定义成员资格.

在帐户模型中,我覆盖了该方法CreateUser:

public override MembershipUser CreateUser(string username, string password,
    string email, string passwordQuestion, string passwordAnswer,
    bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
    ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(
        username, password, true);
    OnValidatingPassword(args);

    if (args.Cancel)
    {
        status = MembershipCreateStatus.InvalidPassword;
        return null;
    }

    if (RequiresUniqueEmail && GetUserNameByEmail(email) != "")
    {
        status = MembershipCreateStatus.DuplicateEmail;
        return null;
    }

    MembershipUser u = GetUser(username, false);
    if (u == null)
    {
        UserRepository _user = new UserRepository();

        // Here I call my new method which has fields I've created in the
        // User table; I'm using entity framework.    
        _user.CreateUser(username, password, email);
        status = MembershipCreateStatus.Success;
        return GetUser(username, false);
    }
    else
    {
        status = MembershipCreateStatus.DuplicateUserName;
    }

    return null;
}

public MembershipUser CreateUser(string username, string password,
    string email)
{
    using (CustomMembershipDB db = new CustomMembershipDB())
    {
        User user = new User();
        user.UserName = username;
        user.Email = email;
        user.PasswordSalt = CreateSalt();
        user.Password = CreatePasswordHash(password, user.PasswordSalt);
        user.CreatedDate = DateTime.Now;
        user.IsActivated = false;
        user.IsLockedOut = false;
        user.LastLockedOutDate = DateTime.Now;
        user.LastLoginDate = DateTime.Now;

        //Generate an email key
        // user.NewEmailKey = GenerateKey();

        db.AddToUsers(user);
        db.SaveChanges();

        //send mail
        // SendMail(user);

        return GetUser(username);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我需要添加更多两个字段,如名字和姓氏,但我怎样才能将它传递给上面的方法?

因为CreateUser如果我在其中添加诸如名字和姓氏之类的参数,覆盖方法会给我一个错误:(

Qor*_*ani 5

您需要实现自定义成员资格用户.这是一个示例实现:

另外看一下这个帖子:


Moh*_*mad 1

您可以保持 AspNetUsers 表不变,并创建一个新表来存储额外信息(链接到原始表)。这样您就不会破坏会员资格提供程序中的任何现有代码。

原始的AspNetUsers表有:[Id],[Email],[EmailConfirmed],[PasswordHash],[SecurityStamp],[PhoneNumber],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount], [用户名]

用于存储额外数据的新表可以具有例如:[Id]、[UserId][DateOfBirth]、[Biography]等。其中[UserId]是AspNetUsers表的外键。

这种方法的一个优点是,您可以创建多种类型的用户,每种用户将其相关信息存储在不同的表中,而公共数据仍在原始表中。

如何:

  1. 首先更新 RegisterViewModel 以包含您想要的额外数据。
  2. 更新帐户控制器中的注册方法,以下是使用插入新配置文件数据的代码更新的原始方法:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
            IdentityResult result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                // Start of new code ----------------------------------------
    
                // Get Id of newly inserted user
                int userId = user.Id; // Get Id of newly inserted user
    
                // Create a profile referencing the userId
                AddUserProfile(userId, model);
    
                // End of new code ----------------------------------------
    
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
        return View(model);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 根据需要实现 AddUserProfile(int userId, RegisterViewModel model) 方法。您将从模型对象中收集额外的数据以及 userId,并将新的配置文件对象保存在数据库中。