Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.Net repeater Item Command not getting fired

Tags:

OK, I've used repeaters literally hundreds of times without problems but something has gone awry today. I have a repeater and I'm subscribing to the itemCommand event, but when my command runs, the page posts back but the event isn't fired.

To get around this I'm having to do my databinding on each postback.

My repeater looks like this:

<asp:Repeater id="MyRepeater" runat="server" onitemcommand="MyRepeater_ItemCommand">
<ItemTemplate>
    <li>
    <asp:Label id="Label" runat="server" />
    <asp:LinkButton id="LinkButton1" runat="server" commandname="Complete" commandargument='<%# Eval("MyID") %>' text='<%# Eval("Title") %>' />
    </li>
</ItemTemplate>
</asp:Repeater>

and my codebehind like this:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
    SetupPage();
    }
}

private void SetupPage()
{
    // Do other stuff

    MyRepeater.DataSource = Repository.GetStuff()
    MyRepeater.DataBind();
}


protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{


// Do all my stuff here
}

MyRepeater_ItemCommand is not getting called unless I comment out the if (!IsPostBack) line. Once that is commented out and the repeater is getting databound on each postback it works OK. I've done this in so many other pages but on this on it just doesn't seem to work.

Anyone else come across this behaviour or have a solution?

like image 597
Ciaran O'Neill Avatar asked Aug 24 '09 12:08

Ciaran O'Neill


2 Answers

Most likely, you have disabled ViewState for the page.

The reason is that when you execute the postback, all the controls in the repeater are rebuild from the data in the viewstate normally. Then the object that should receive the event is identified based on the ID of the control, and the event is routed.

If you disable the viewstate, the control tree is not rebuild during postback, and therefore the control that should receive the event does not exist in memory. So the event dies.

If you really want to disable the viewstate, but still want to receive the event, I have a workaround (and it's not dirty at all). I've long been thinking about writing a blog entry about it, so if you want, I can take a bit time off my normal chores, and describe it.

Edit: The workaround is described here: http://petesdotnet.blogspot.dk/2009/08/asp.html

like image 167
Pete Avatar answered Sep 29 '22 16:09

Pete


Remove if (!IsPostBack) as this is preventing the repeater from rebinding, and the item command event could not find the row after postback.

like image 28
Prashant Avatar answered Sep 29 '22 15:09

Prashant