【问题标题】:Make ASP Validators validate just one gridview row?让 ASP 验证器只验证一个 gridview 行?
【发布时间】:2015-06-12 15:34:25
【问题描述】:

我正在为自己制作一个小网站,您可以在这个网站中创建用户。添加用户的那一刻,它会进入数据库。您还可以在 gridview 中查看现有用户,因此当您创建新用户时,它会进入 gridview。但是有一个小问题,当我尝试在这个 gridview 中使用验证器时,它会验证每一行。我需要它来验证一行。有人说了一些关于行 ID 的内容,但我不知道如何使它起作用。

如您所见,我尝试了一些使用 RowIndex 的东西,但无法让它工作

感谢任何帮助 管理.aspx:

        <asp:GridView runat="server" ID="gridUsers" AutoGenerateColumns="False" DataKeyNames="username" DataSourceID="DSUserList" OnRowCommand="gridUsers_RowCommand">
            <Columns>
                <asp:BoundField DataField="username" HeaderText="Gebruikersnaam" ReadOnly="True" SortExpression="username"></asp:BoundField>
                <asp:BoundField DataField="display_name" HeaderText="Naam" SortExpression="display_name"></asp:BoundField>
                <asp:TemplateField >
                    <ItemTemplate>
                        <asp:Button OnClientClick="ConfirmDeleteAdmin()" Text="Verwijderen" runat="server" id="btnDeleteUser" CommandName="delUser" CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"/>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox runat="server" id="txtChangePassword" />
                       <%-- TODO: Mike: Validators via code --%>
                        <asp:Button OnClientClick="ConfirmChangePassword()" ValidationGroup="vgChangePW" Text="Wachtwoord wijzigen" runat="server" ID="btnChangePassword" CommandName="changePassword" CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" />  
                     <%-- <asp:RequiredFieldValidator ID="rfChangePassReq" ControlToValidate="<%# String.Format("txtChangePW{0}",((GridViewRow) Container).RowIndex).ToString() %>" ValidationGroup="vgChangePW" runat="server" ErrorMessage="<br/>U heeft geen nieuw wachtwoord ingevoerd"></asp:RequiredFieldValidator>--%>
                    <%-- asp:RegularExpressionValidator ID="rfChangePassReg" ValidationExpression="^(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$" ControlToValidate="<%# String.Format("txtChangePW{0}",((GridViewRow) Container).RowIndex).ToString() %>" ValidationGroup="vgChangePW" runat="server" ErrorMessage="<br/>Uw wachtwoord moet uit minimaal 6 tekenen bestaan en moet minimaal 1 hoofdletter en 1 cijfer bevatten"></asp:RegularExpressionValidator>--%>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
         </asp:GridView>

管理.aspx.cs:

protected void btnCreateUser_Click(object sender, EventArgs e)
    {
        try {
        connection.Open();
        } catch (Exception) {}

        String password = txtPassword.Text.Trim();
        password = password != "" ? ProjectManager.GetSHA1HashData(password) : "";

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Connection = connection;
        cmd.CommandText = "sp_add_user";

        cmd.Parameters.Add("@username", SqlDbType.NVarChar, 100).Value = txtUsername.Text;
        cmd.Parameters.Add("@password", SqlDbType.NVarChar, 100).Value = password;
        cmd.Parameters.Add("@displayName", SqlDbType.NVarChar, 100).Value = txtDisplayName.Text;
        cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
        cmd.ExecuteNonQuery();

        int code = int.Parse(cmd.Parameters["@return_value"].Value.ToString());

        if (code == 0)
        {
            lblNewUserStatus.Text = "Gebruiker bestaat al";
            lblNewUserStatus.ForeColor = Color.Red;
        }
        else
        {
            DSUserList.EnableCaching = false;
            gridUsers.DataBind();
            DSUserList.EnableCaching = true;

            lblNewUserStatus.Text = "Gebruiker toegevoegd";
            lblNewUserStatus.ForeColor = Color.Black;

            txtUsername.Text = "";
            txtPassword.Text = "";
            txtDisplayName.Text = "";
        }
        connection.Close();
    }

    protected void gridUsers_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        // Deletes user or changes a password of a user
        if (e.CommandName == "delUser") 
        {
            string confirmValue = Request.Form["delete_admin"];
            if (confirmValue == "Yes") {
                int index = Convert.ToInt32(e.CommandArgument);

                GridViewRow row = gridUsers.Rows[index];

                String usernameToDelete = row.Cells[0].Text;

                try {
                    connection.Open();
                } catch (Exception) { }

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = connection;
                cmd.CommandText = "sp_delete_user";
                cmd.Parameters.Add("@username", SqlDbType.NVarChar, 100).Value = usernameToDelete;
                cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
                cmd.ExecuteNonQuery();

                int code = int.Parse(cmd.Parameters["@return_value"].Value.ToString());

                if (code == 0) {
                    //Failed
                    lblDelteStatus.Text = "Kan gebruiker admin niet verwijderen";
                    lblDelteStatus.ForeColor = Color.Red;
                } else {
                    // Deleted
                    lblDelteStatus.Text = "Gebruiker verwijderd";
                    lblDelteStatus.ForeColor = Color.Black;

                    // Reload user list
                    DSUserList.EnableCaching = false;
                    gridUsers.DataBind();
                    DSUserList.EnableCaching = true;
                }
                connection.Close();

                if (usernameToDelete == Session["username"].ToString()) {
                    ProjectManager.logout();
                    Page.Response.Redirect(Page.Request.Url.ToString());
                }
            }
        }
        else if (e.CommandName == "changePassword")
        {
            string confirmValue = Request.Form["change_password"];
            if (confirmValue == "Yes") {
                int index = Convert.ToInt32(e.CommandArgument);

                GridViewRow row = gridUsers.Rows[index];

                String username = row.Cells[0].Text;
                TextBox txtPassword = (TextBox)row.Cells[3].FindControl("txtChangePassword");
                String password = txtPassword.Text.Trim();
                password = password != "" ? ProjectManager.GetSHA1HashData(password) : "";



                try {
                    connection.Open();
                } catch (Exception) { }

                cmd.Connection = connection;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "sp_change_password";
                cmd.Parameters.Add("@password", SqlDbType.NVarChar, 100).Value = password;
                cmd.Parameters.Add("@username", SqlDbType.NVarChar, 100).Value = username;
                cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
                cmd.ExecuteNonQuery();

                int code = int.Parse(cmd.Parameters["@return_value"].Value.ToString());

                if (code == 0) {
                    lblDelteStatus.Text = "Dit wachtwoord is onlangs gebruikt, kies een ander wachtwoord";
                    lblDelteStatus.ForeColor = Color.Red;
                } else if (code == 1) {
                    lblDelteStatus.Text = "Wachtwoord gewijzigd";
                    lblDelteStatus.ForeColor = Color.Black;
                }

                connection.Close();
            }
        }
    }

【问题讨论】:

    标签: c# asp.net validation gridview


    【解决方案1】:

    在 RowDataBound 事件中试试这个:

    创建一个特定于行的验证组名称,它是某个前缀和行索引的串联,并将其分配给作为验证组一部分的行中的每个验证器和控件...即:

    valGroupName = string.format("vgRow{0}", e.row.rowindex.tostring);
    
    Button btn = e.row.FindControl("btnChangePassword");
    btn.ValidationGroup = valGroupName
    
    RequiredFieldValidator vreq = e.row.FindControl("rfChangePassReq");
    vreq.ValidationGroup = valGroupName
    
    RegularExpressionValidator vregx =  e.row.FindControl("rfChangePassReg");
    vregx.ValidationGroup = valGroupName
    
    ...etc...
    

    这样,当您选择要保存的行按钮时,只会触发对特定行的验证。

    我不记得了,我现在无法测试它,但您可能对连接到 RequiredFieldValidator 的任何字段有疑问,它可能会阻止发布。你必须检查一下。您可能没问题,因为他们将属于不同的验证组。

    【讨论】:

    • 太棒了!我在 aspx 页面上被分配了 ValidationGroup 名称,这意味着所有行都具有相同的名称!这样,我为每一行分配一个唯一的名称并仅验证该行!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2019-07-08
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多