Как добавить дополнительные настраиваемые поля, используя членство в mvc? - PullRequest
7 голосов
/ 06 января 2012

Я переопределил методы членства для создания пользовательского членства.

В модели учетной записи я переопределил метод 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);
    }
}

Теперь здесь мне нужно добавитьеще два поля, такие как имя и фамилия, но как я могу передать его вышеуказанному методу?

Поскольку метод переопределения CreateUser выдаст мне ошибку, если я добавлю в него такие параметры, как имя и фамилия:(* 1 010 *

Ответы [ 4 ]

5 голосов
/ 06 января 2012
1 голос
/ 28 августа 2014

Вы можете оставить таблицу AspNetUsers без изменений и создать новую таблицу для хранения дополнительной информации (связанной с исходной). Таким образом, вы не нарушите существующий код в поставщике членства.

Исходная таблица AspNetUsers имеет: [Id], [E-mail], [EmailConfirmed], [PasswordHash], [SecurityStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEndDateUtc], [LockoutEnabled], [AccessFailedCount], [UserName]

Новая таблица для хранения дополнительных данных может иметь, например: [Id], [UserId] [DateOfBirth], [Биография] и т. Д. Где [UserId] - это внешний ключ таблицы AspNetUsers.

Одним из преимуществ этого подхода является то, что вы можете создавать несколько типов пользователей, каждый из которых сохраняет свою связанную информацию в отдельной таблице, в то время как общие данные все еще находятся в исходной таблице.

Как:

  1. Сначала обновите RegisterViewModel, чтобы он содержал дополнительные данные, которые вы хотите.
  2. Обновите метод Register в контроллере учетной записи, вот оригинальный метод, обновленный кодом для вставки новых данных профиля:

    [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);
    }
    
  3. Реализуйте метод AddUserProfile (int userId, модель RegisterViewModel) по вашему желанию. Вы соберете дополнительные данные из объекта модели вместе с userId и сохраните новый объект профиля в БД.
0 голосов
/ 08 февраля 2012

Вот как я совершил нечто подобное.Я добавил событие onCreatedUser в CreateUserWizard и при нажатии кнопки CreateUser загружается метод

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
    {
        MembershipUser mu = Membership.GetUser(CreateUserWizard1.UserName);
        int idOfInsertedUser = (int)mu.ProviderUserKey;

        TextBox tb1 = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("FirstName";
        string firstName= tb1.Text;
        TextBox tb2 = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("LastName";
        string lastName= tb2.Text;  

// now you have values of two more fields, and it is time to call your Database methods for inserting them in tables of choice...
    }
0 голосов
/ 06 января 2012

Создайте класс, который наследуется от MembershipProvider, и реализуйте идентичные методы, просто вызвав SqlMembershipProvider, но измените другие так, чтобы вы хотели другую функциональность.

Взгляните на эту статью Поставщик SQLite 3.0 и поставщик ролей для ASP.NET 2.0

UPDATE:

Система членства в ASP.NET была разработана для создания стандартизированной API для работы с учетными записями пользователей, задача, с которой сталкиваются многие веб приложения (обратитесь к части 1 этой серии статей для более углубленный взгляд на членство). В то время как система членства охватывает основные пользовательские свойства - имя пользователя, пароль, адрес электронной почты и и так далее - часто необходимо собирать дополнительную информацию для каждый пользователь. К сожалению, эта дополнительная информация может отличаться дико из приложения в приложение.

Вместо добавления дополнительных пользовательских атрибутов в систему членства, Вместо этого Microsoft создала систему профилей для обработки дополнительных пользователей свойства. Система профилей допускает дополнительные, специфичные для пользователя свойства, которые должны быть определены в файле Web.config и отвечают за сохранение этих значений в некотором хранилище данных.

Ссылка: Изучение членства, ролей и профиля ASP.NET - часть 6

...