2010-04-27 6 views
1

Je travaille actuellement sur un système d'adhésion pour mon application web, qui est basé sur l'authentification par formulaires du framework.Membership.Updateuser ne met pas vraiment à jour la base de données

J'ai créé quelques utilisateurs avec l'outil intégré, et la connexion fonctionne parfaitement. Mais maintenant, ce que je veux faire est de donner à l'administrateur la possibilité de créer, modifier, supprimer des utilisateurs.

Voici donc ce que j'ai en ce moment:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim muc As MembershipUserCollection = Membership.GetAllUsers() 

    ComboBox1.DataSource = muc 
    ComboBox1.DataValueField = "UserName" 
    ComboBox1.DataTextField = "UserName" 
    ComboBox1.DataBind() 
End Sub 

Protected Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged 

    Dim userName As String = ComboBox1.SelectedValue 

    Dim mu As MembershipUser = Membership.GetUser(userName) 

    Dim userRoles As String() = Roles.GetRolesForUser(userName) 

    tbComments.Text = mu.Comment 
    tbEmail.Text = mu.Email 
    lblUserName.Text = mu.UserName 
End Sub 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    Dim userName As String = ComboBox1.SelectedValue 
    Dim mu As MembershipUser = Membership.GetUser(userName) 

    If Not mu Is Nothing Then 
     Try 
      mu.Comment = tbComments.Text 
      Membership.UpdateUser(mu) 

      mu.Email = tbEmail.Text 
      Membership.UpdateUser(mu) 

      mu.IsApproved = True 
      Membership.UpdateUser(mu) 

      mu = Nothing 
     Catch ex As Exception 
      Console.WriteLine(ex.ToString()) 
     End Try 
    End If 

    DetailPanel.Visible = False 
End Sub 

Le problème est que le dossier ne semble pas être mis à jour dans la base de données. J'ai fait les appels multiples à Membership.UpdateUser après avoir lu this blog entry, mais cela n'a rien changé.

Chose étrange, j'ai remarqué pendant le débogage, est que lorsque j'entre la méthode Button1_Click, Membership.GetUser(userName) me renvoie des valeurs de ma tentative de précédent! Je ne comprends pas vraiment ce qui me manque.

Quelqu'un a une idée?

Merci d'avance!

+0

Ok ... tant pis, je devais juste envelopper l'initialisation combobox dans un 'Si non Page.IsPostBack Alors ... End If 'déclaration. Le premier élément de la liste déroulante était toujours mis à jour car sa valeur sélectionnée était cet élément. Que dois-je faire? Supprimer la question? – Shimrod

+0

Et NON, ne supprimez jamais une question, même la vôtre et surtout si vous venez à la solution vous-même. L'objectif est de fournir une Q/R pour tout le monde, pas seulement pour le questionneur. –

+0

Vous avez raison, je suis totalement d'accord avec cela ;-) Je demandais juste parce que dans ce cas, le problème n'était pas vraiment lié à ma question :-) Votre réponse est vraiment utile quand même, je l'accepte! Merci :-) – Shimrod

Répondre

4

Première:

L'entrée de blog que vous citez est juste mal.

Voici la méthode que vous appelez, dites-moi si vous voyez une indication qu'il doit être appelé plusieurs fois pour mettre à jour des propriétés multiples:

public override void UpdateUser(MembershipUser user) 
{ 
    if (user == null) 
    { 
     throw new ArgumentNullException("user"); 
    } 
    SecUtility.CheckParameter(ref user.UserName, true, true, true, 0x100, "UserName"); 
    string email = user.Email; 
    SecUtility.CheckParameter(ref email, this.RequiresUniqueEmail, this.RequiresUniqueEmail, false, 0x100, "Email"); 
    user.Email = email; 
    try 
    { 
     SqlConnectionHolder connection = null; 
     try 
     { 
      connection = SqlConnectionHelper.GetConnection(this._sqlConnectionString, true); 
      this.CheckSchemaVersion(connection.Connection); 
      SqlCommand command = new SqlCommand("dbo.aspnet_Membership_UpdateUser", connection.Connection); 
      command.CommandTimeout = this.CommandTimeout; 
      command.CommandType = CommandType.StoredProcedure; 
      command.Parameters.Add(this.CreateInputParam("@ApplicationName", SqlDbType.NVarChar, this.ApplicationName)); 
      command.Parameters.Add(this.CreateInputParam("@UserName", SqlDbType.NVarChar, user.UserName)); 
      command.Parameters.Add(this.CreateInputParam("@Email", SqlDbType.NVarChar, user.Email)); 
      command.Parameters.Add(this.CreateInputParam("@Comment", SqlDbType.NText, user.Comment)); 
      command.Parameters.Add(this.CreateInputParam("@IsApproved", SqlDbType.Bit, user.IsApproved ? 1 : 0)); 
      command.Parameters.Add(this.CreateInputParam("@LastLoginDate", SqlDbType.DateTime, user.LastLoginDate.ToUniversalTime())); 
      command.Parameters.Add(this.CreateInputParam("@LastActivityDate", SqlDbType.DateTime, user.LastActivityDate.ToUniversalTime())); 
      command.Parameters.Add(this.CreateInputParam("@UniqueEmail", SqlDbType.Int, this.RequiresUniqueEmail ? 1 : 0)); 
      command.Parameters.Add(this.CreateInputParam("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow)); 
      SqlParameter parameter = new SqlParameter("@ReturnValue", SqlDbType.Int); 
      parameter.Direction = ParameterDirection.ReturnValue; 
      command.Parameters.Add(parameter); 
      command.ExecuteNonQuery(); 
      int status = (parameter.Value != null) ? ((int) parameter.Value) : -1; 
      if (status != 0) 
      { 
       throw new ProviderException(this.GetExceptionText(status)); 
      } 
     } 
     finally 
     { 
      if (connection != null) 
      { 
       connection.Close(); 
       connection = null; 
      } 
     } 
    } 
    catch 
    { 
     throw; 
    } 
} 

Deuxième:

Vous reconsolidation votre liste chaque publication. Cela doit être fait une seule fois et la liste est stockée dans viewstate.

Voici une implémentation fonctionnelle:

UpdateUser.aspx

<%@ Page Language="vb" %> 

<script runat="server"> 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     ' be sure that DropDownList1.AutoPostBack = true 

     If Not IsPostBack Then 
      BindUserList() 
     End If 
    End Sub 


    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
     DisplayDetails(ComboBox1.SelectedValue) 
    End Sub 


    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
     Dim approved As Boolean = True 
     Dim username As String = ComboBox1.SelectedValue 
     Dim comments As String = tbComments.Text 
     Dim email As String = tbEmail.Text 

     UpdateUser(username, approved, comments, email) 
    End Sub 

    Private Sub BindUserList() 
     '' you only need to databind once, the datasource is stored in viewstate 
     Dim muc As MembershipUserCollection = Membership.GetAllUsers() 

     ComboBox1.DataSource = muc 
     ComboBox1.DataValueField = "UserName" 
     ComboBox1.DataTextField = "UserName" 
     ComboBox1.DataBind() 
     '' initialize the selection 
     ComboBox1_SelectedIndexChanged(ComboBox1, EventArgs.Empty) 
    End Sub 


    Private Sub DisplayDetails(ByVal userName As String) 
     Dim mu As MembershipUser = Membership.GetUser(userName) 

     Dim userRoles As String() = Roles.GetRolesForUser(userName) 

     tbComments.Text = mu.Comment 
     tbEmail.Text = mu.Email 
     lblUserName.Text = mu.UserName 
    End Sub 

    Private Sub UpdateUser(ByVal userName As String, ByVal approved As Boolean, ByVal comments As String, ByVal email As String) 
     Dim mu As MembershipUser = Membership.GetUser(userName) 
     If Not mu Is Nothing Then 
      Try 

       mu.Comment = comments 
       mu.Email = email 
       mu.IsApproved = approved 

       Membership.UpdateUser(mu) 

       ErrLabel.Text = "" 
      Catch ex As Exception 
       ErrLabel.Text = ex.Message 
      End Try 
     End If 
    End Sub 
</script> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:DropDownList ID="ComboBox1" runat="server" AutoPostBack="True"> 
     </asp:DropDownList> 
    </div> 
    <p> 
     UserName:<asp:Label ID="lblUserName" runat="server" Text=""></asp:Label><br /> 
     Email:<asp:TextBox ID="tbEmail" runat="server"></asp:TextBox><br /> 
     Comments:<asp:TextBox ID="tbComments" runat="server"></asp:TextBox><br /> 
    </p> 
    <asp:Button ID="Button1" runat="server" Text="Update" Height="26px" Width="61px" /><br /> 
    <asp:Label ID="ErrLabel" runat="server" Text=""></asp:Label> 
    </form> 
</body> 
</html> 
Questions connexes