代码之家  ›  专栏  ›  技术社区  ›  Shimrod

membership.updateUser没有真正更新数据库

  •  1
  • Shimrod  · 技术社区  · 14 年前

    我目前正在为我的Web应用程序开发一个成员系统,它基于框架中的表单认证。

    我用集成的工具创建了一些用户,登录非常有效。但现在我要做的是让管理员能够创建、修改和删除用户。

    所以我现在得到的是:

    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
    

    问题是数据库中的记录似乎没有更新。 我打了多次电话给 Membership.UpdateUser 阅读后 this blog entry 但是没有改变。

    调试时我注意到的一个奇怪的事情是,当我进入 Button1_Click 方法, Membership.GetUser(userName) 从我的先例尝试中返回值!我真的不明白我错过了什么。

    有人有线索吗?

    事先谢谢!

    1 回复  |  直到 14 年前
        1
  •  4
  •   Sky Sanders    14 年前

    第一:

    你引用的博客只是 错误的 .

    下面是您要调用的方法,如果看到需要多次调用才能更新多个属性的指示,请告诉我:

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

    第二个:

    每次发回邮件都会重新绑定列表。此操作只需执行一次,列表将存储在viewstate中。

    下面是一个工作实现:

    更新用户.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>