6

Ho sovrascritto i metodi di appartenenza per creare un abbonamento personalizzato.Come aggiungere altri campi personalizzati utilizzando l'appartenenza personalizzata in mvc?

Nel modello conto che ho sovrascritto il metodo 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); 
    } 
} 

Ora qui ho bisogno di aggiungere altri due campi come nome e cognome, ma come posso passarlo al metodo di cui sopra ? .

Come il metodo di sostituzione CreateUser mi darà un errore se aggiungo parametri come il nome cognome e l'ultimo in esso :(

+1

In realtà non si dovrebbe provare ad aggiungere campi alla classe MembershipUser. Se si desidera memorizzare FirstName, LastName, ecc, il profilo e ProfileProvider ('' in web.config) è stato progettato per questo. – danludwig

+0

come posso usarlo per favore dammi qualche link? – Neo

+0

questo è il tuo link: https://www.google.com?q=asp.net+profile+provider – danludwig

risposta

1

È possibile lasciare il tavolo AspNetUsers intatto, e creare una nuova tabella per memorizzare le informazioni extra (legata a quella originale). In questo modo non infrangerete alcun codice esistente nel provider di appartenenza.

La tabella originale AspNetUsers ha: [id], [e-mail], [email confermata], [PasswordHash], [SecurityStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEndDateUtc], [LockoutEnabled] , [AccessFailedCount], [username]

la nuova tabella per memorizzare i dati in più può avere, per esempio: [id], [userid] [DateOfBirth], [Biografia], ecc Dove [userid] è la straniera chiave per la tabella AspNetUsers.

Un vantaggio di questo approccio è che è possibile creare più tipi di utenti, ognuno dei quali memorizza le relative informazioni in una tabella diversa, mentre i dati comuni sono ancora nella tabella originale.

Procedura:

  1. Primo aggiornamento del RegisterViewModel per contenere i dati in più si desidera.
  2. Aggiornare il metodo Register nel controller account, ecco il metodo originale aggiornato con il codice da inserire nuovi dati del profilo:

    [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. Implementare l'AddUserProfile (int userId, modello RegisterViewModel) Metodo come si desidera. Raccoglierai i dati extra dall'oggetto modello insieme a userId e salverà il nuovo oggetto profilo nel DB.
0

fare una classe che eredita da MembershipProvider ed applicare metodi che sono identici, semplicemente chiamando lo SqlMembershipProvider ma cambiare gli altri che si desidera un funzionalità diverse.

Date un'occhiata a questo articolo SQLite 3.0 Membership and Role Provider for ASP.NET 2.0

UPDATE:

Il sistema di abbonamento in ASP.NET è stato progettato per creare un standardizzato API per lavorare con gli account utente, un compito affrontato da molte applicazioni web (fare riferimento alla parte 1 di questa serie di articoli per ulteriori informazioni su Approfondimento). Mentre il sistema Membership comprende le proprietà principali dell'utente - nome utente, password, indirizzo e-mail e così via - spesso è necessario acquisire ulteriori informazioni per per ciascun utente. Sfortunatamente, queste informazioni aggiuntive possono differire da da un'applicazione all'altra.

Anziché aggiungere ulteriori attributi utente al sistema Membership, Microsoft ha invece creato il sistema Profilo per gestire ulteriori proprietà utente . Il sistema Profilo consente di definire le proprietà aggiuntive, specifiche dell'utente nel file Web.config ed è responsabile della permanenza di questi valori su alcuni archivi dati per .

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

+0

mi puoi suggerire dove posso mettere il mio oggetto di primo nome nel codice di sopra? – Neo

+0

Dai un'occhiata a questo post http: //www.4guysfromrolla.com/articles/101106-1.aspx –

+0

lo sto facendo in MVC puoi rintracciare il mio codice sopra per favore? – Neo

0

Ecco come ho compiuto somthing come questo.Ho aggiunto evento onCreatedUser di CreateUserWizard e quando si preme il pulsante CreateUser lo carica metodo

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... 
    }