Search code examples
asp.netrequiredfieldvalidator

validator shows, but button executes server code


Something seems to be broken...I have a asp textbox in my Web Forms application, that has a Required Field Validator. If the textbox is empty, it shows the validator but also executes the server code, in that case code for insert into a table:

<div class="form-group">
            <asp:Label ID="lblPName" runat="server" CssClass="col-md-2 control-label" Text="Category Name"></asp:Label>
            <div class="col-md-3">
                <asp:TextBox ID="txtCategoryName" runat="server" CssClass="form-control"></asp:TextBox>
                <asp:RequiredFieldValidator ID="RequiredFieldValidator1" CssClass="text-danger" runat="server" ErrorMessage="This Field is required" ControlToValidate="txtCategoryName"></asp:RequiredFieldValidator>
            </div>
        </div>

Button code:

<div class="form-group">
            <div class="col-md-2"></div>
            <div class="col-md-6">
                <asp:Button ID="btnAddCategory" CssClass="btn btn-default" runat="server" Text="Add" onclick="btnAddCategory_Click" />
            </div>
        </div>

And my server side code for inserting data:

string cs = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("Insert into tblCategories values(@CategoryName)", con);
            cmd.Parameters.AddWithValue("@CategoryName", txtCategoryName.Text);
            con.Open();
            cmd.ExecuteNonQuery();
            txtCategoryName.Text = string.Empty;
        }
        BindCategoryRepeater();

Any reason why something like that would happen?


Solution

  • Reference: RequiredFieldValidator Class

    Add an if else with Page.IsValid in your server side code

    if(Page.IsValid)
    {
        string cs = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand("Insert into tblCategories values(@CategoryName)", con);
            cmd.Parameters.AddWithValue("@CategoryName", txtCategoryName.Text);
            con.Open();
            cmd.ExecuteNonQuery();
            txtCategoryName.Text = string.Empty;
        }
        BindCategoryRepeater();
    }
    else
    {
        //handle the error
    }