6

Nadpisałem metody członkostwa, aby utworzyć członkostwo niestandardowe.Jak dodać więcej niestandardowych pól przy użyciu członkostwa niestandardowego w mvc?

W modelu rachunku mam przesłonięte metody 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); 
    } 
} 

Teraz tutaj trzeba dodać kolejne dwa pola, takie jak imię i nazwisko, ale w jaki sposób można przekazać je do powyższego sposobu ? .

Jako metodę obejścia CreateUser da mi błąd, jeśli dodam parametry, takie jak imię i nazwisko do niego :(

+1

Naprawdę nie powinieneś próbować dodawać pól do klasy MembershipUser. Jeśli chcesz przechowywać FirstName, LastName, etc, profil i ProfileProvider ("" w web.config) został zaprojektowany do tego. – danludwig

+0

jak mogę tego użyć, proszę podać dowolny link? – Neo

+0

Oto twój link: https://www.google.com?q=asp.net+profile+provider – danludwig

Odpowiedz

1

Można odejść od stołu AspNetUsers nienaruszonym i utworzyć nową tabelę do przechowywania dodatkowych informacji (powiązany z oryginałem). W ten sposób nie złamiesz żadnego istniejącego kodu w dostawcy członkostwa.

szybie AspNetUsers posiada: [Id], [E], [EmailConfirmed] [PasswordHash] [SecurityStamp] [PhoneNumber] [PhoneNumberConfirmed] [TwoFactorEnabled] [LockoutEndDateUtc] [LockoutEnabled] [AccessFailedCount], [nazwa_użytkownika]

nowa tabela do przechowywania dodatkowych danych może mieć na przykład: [id], [UserId] [DateOfBirth], [Biografia] itd Gdzie [UserId] jest obcy klucz do tabeli AspNetUsers.

Zaletą tego podejścia jest możliwość tworzenia wielu typów użytkowników, z których każdy przechowuje powiązane informacje w innej tabeli, podczas gdy wspólne dane znajdują się nadal w oryginalnej tabeli.

Jak:

  1. najpierw zaktualizować RegisterViewModel zawierać dodatkowe dane, które chcesz.
  2. Aktualizacja metoda Rejestracja w kontrolerze konta, tutaj jest oryginalna metoda na bieżąco z kodem, aby wstawić nowe dane profilu:

    [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. Wdrożenie AddUserProfile (int userid, model RegisterViewModel) metodę, jak chcesz. Będziesz zbierać dodatkowe dane z obiektu modelu wraz z userId i zapisać nowy obiekt profilu w DB.
0

Dodać do klasy, która dziedziczy z MembershipProvider i wdrożenie metod, które są identyczne po prostu wywołanie SqlMembershipProvider ale zmienić innych, które mają inną funkcjonalność.

Spójrz na ten artykuł SQLite 3.0 Membership and Role Provider for ASP.NET 2.0

UPDATE:

System Członkostwo w ASP.NET został zaprojektowany, aby stworzyć znormalizowany API do pracy z kontami użytkowników, zadanie napotykają wiele aplikacji internetowych (odnieś się do części 1 tej serii artykułów, aby uzyskać bardziej szczegółowe spojrzenie na członkostwo). Podczas gdy system członkostwa obejmuje podstawowe właściwości związane z użytkownikiem - nazwa użytkownika, hasło, adres e-mail i , więc w razie potrzeby należy przechwycić dodatkowe informacje dla każdego użytkownika. Niestety, ta dodatkowa informacja może różnić się od aplikacji do aplikacji.

Zamiast dodawać dodatkowe atrybuty użytkownika do systemu członkostwa, firma Microsoft zamiast tego utworzyła system profili, aby obsłużyć dodatkowe właściwości użytkownika o następujących właściwościach: . System profili umożliwia zdefiniowanie dodatkowych, specyficznych dla użytkownika właściwości w pliku Web.config i jest odpowiedzialny za utrzymanie tych wartości w niektórych składnicach danych.

referencyjny: Examining ASP.NET's Membership, Roles, and Profile - Part 6

+0

czy możesz mi zaproponować, gdzie mogę umieścić moje imię w powyższym kodzie? – Neo

+0

Zobacz ten post http: //www.4guysfromrolla.com/articles/101106-1.aspx –

+0

robię to w MVC możesz wyśledzić mój powyższy kod, proszę? – Neo

0

To jak mam osiągnąć somthing tak.I dodaje zdarzenie onCreatedUser do CreateUserWizard i po naciśnięciu przycisku CreateUser ładuje metody

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... 
    } 
Powiązane problemy