AT-2017
AT-2017

Reputation: 3149

On Button Click Does Not Fire Up The PostBackUrl Once

This seems to be an easy one but got stuck on it last few hours. I've a search button that fires up PostBackUrl. The issue is it only fires up when I click the search button for the second time. Here what I did:

Default.aspx.cs:

 protected void Page_Load(object sender, EventArgs e)
    {
        Page.Title = "View Cities - CcmApp";

        if (!IsPostBack)
        {
            BindGridView(0);
            BindPager(0);

            GetCountries();
        }
    } 

 protected void SearchButton_Click(object sender, EventArgs e)
    {
        City aCity = new City();
        aCity.CityName = nameTextBox.Text;

        if (nameTextBox.Text.Length == 0 && radioCityName.Checked == true)
        {
            labelMsg.Visible = true;
            labelMsg.Text = "No search term given";
        }
        else
        {
            SearchButton.PostBackUrl = GetDefaultUrl();
        }

        BindGridView(0);
        BindPager(0);
    }

 public string GetDefaultUrl()
    {
       return "SearchCity.aspx?SearchTerm=" + nameTextBox.Text;
    }

Default.aspx:

<asp:LinkButton ID="SearchButton" runat="server" Text="Search" ValidationGroup="vdGroup" 
CssClass="btn btn-primary" OnClick="SearchButton_Click"></asp:LinkButton>

I am not sure what causes it click second time to get the url. Is there any way to get over it?

Note: I am expecting to get the following output in the url - http://localhost:1234/UI/SearchCity.aspx?SearchTerm=a. But works only on second button click. When I click for the first time, I get this - http://localhost:1234/UI/SearchCity.aspx

Upvotes: 1

Views: 627

Answers (1)

VDWWD
VDWWD

Reputation: 35564

The PostBackUrl url on the button is only set AFTER the first PostBack. If you would set it in Page_Load for example you will see that it will work on the first PostBack.

If you want the ?SearchTerm= in the url only when there is content in nameTextBox you could use Response.Redirect or accept that there is no data in ?SearchTerm=.

Better still check on the Clientside if nameTextBox has text and prevent the button click using a Validator.

<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="/Default.aspx?SearchTerm=" ValidationGroup="mySearch">Search</asp:LinkButton>

<asp:CustomValidator ID="CustomValidator1" runat="server" ControlToValidate="nameTextBox" ClientValidationFunction="checkLength" ValidateEmptyText="true" ErrorMessage="Min. 3 characters required" ValidationGroup="mySearch"></asp:CustomValidator>

<script type="text/javascript">
    function checkLength(oSrc, args) {
        var v = document.getElementById("<%=nameTextBox.ClientID %>").value;
        if (v.length < 3) {
            args.IsValid = false;
        } else {
            $("#<%=LinkButton1.ClientID %>").attr("onclick", $("#<%=LinkButton1.ClientID %>").attr("onclick").replace("?SearchTerm=", "?SearchTerm=" + v));
            args.IsValid = true;
        }
    }
</script>

Upvotes: 3

Related Questions