6

Я переопределил методы членства для создания пользовательского членства.Как добавить дополнительные пользовательские поля, используя пользовательское членство в mvc?

В модели счета я переопределен метод 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

Вы действительно не должны пытаться добавлять поля в класс MembershipUser. Если вы хотите сохранить FirstName, LastName и т. Д., Для этого был создан Profile & ProfileProvider ('' в web.config). – danludwig

+0

Как я могу использовать это, пожалуйста, дайте мне ссылку? – Neo

+0

вот ваша ссылка: https://www.google.com?q=asp.net+profile+provider – danludwig

ответ

1

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

Оригинальный AspNetUsers таблица имеет: [Id], [E-mail], [EmailConfirmed], [PasswordHash], [SecurityStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEndDateUtc], [LockoutEnabled] [AccessFailedCount], [UserName]

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

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

Как:

  1. Первое обновляют RegisterViewModel содержит дополнительные данные, которые вы хотите.
  2. Обновление метод Регистрация в контроллере Account, вот оригинальный метод обновляется с кодом, чтобы вставить новые данные профиля:

    [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 и сохранять новый объект профиля в БД.
5

Вы должны осуществить заказ членство пользователя Вот пример реализация:

Также посмотрите на эту тему:

+0

Можете ли вы предложить мне, где я могу разместить свое первое имя в вышеуказанном коде? – Neo

0

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

Посмотрите на эту статью SQLite 3.0 Membership and Role Provider for ASP.NET 2.0

UPDATE:

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

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

Ссылка: Examining ASP.NET's Membership, Roles, and Profile - Part 6

+0

Можете ли вы предложить мне, где я могу разместить свое первое имя в вышеуказанном коде? – Neo

+0

Взгляните на это сообщение http: //www.4guysfromrolla.com/articles/101106-1.aspx –

+0

Я делаю это в MVC, вы можете проследить мой код выше? – Neo

0

Это, как я достиг Somthing как это.Я добавил событие 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... 
    }