Reputation: 619
I am trying to add an OnClick attribute to a button from the code behind. Depending if the Attending element is 0 or not will determine which OnClick attribute gets added. When I click the button with the code below I get the following error:
"Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerServerErrorException: Invalid postback or callback argument. Event validation is enabled using in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation."
What am I doing wrong?
ASPX
<%@ Page Title="" Language="C#" EnableEventValidation="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="test.CommunityEvents.Default" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DataList ID="DataList1" RepeatColumns="1" CellPadding="5" OnItemDataBound="Dl1_ItemDataBound"
runat="server">
<ItemTemplate>
<div id="Attendingbox" runat="server">
<asp:Label ID="AttendingorNot" runat="server"></asp:Label>
</div>
<br />
<asp:Button ID="SignupButton" runat="server" Text="" />
</ItemTemplate>
</asp:DataList>
</ContentTemplate>
</asp:UpdatePanel>
Code Behind
protected void Dl1_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
.....//removed other code to save space
Button SignupButton = (Button)e.Item.FindControl("SignupButton");
if (Attending == 0)
{
AttendingorNot.Text = "You are not attending";
AttendingorNot.Attributes.Add("class", "alert");
SignupButton.Text = "Attend";
SignupButton.Attributes.Add("class", "btn btn-large btn-success");
SignupButton.Click += new EventHandler(Submit_Add);
}
else
{
AttendingorNot.Text = "You are attending!";
AttendingorNot.Attributes.Add("class", "alert alert-success");
SignupButton.Text = "Remove";
SignupButton.Attributes.Add("class", "btn btn-large btn-danger");
SignupButton.Click += new EventHandler(Submit_Remove);
}
}
}
private void Submit_Remove(object sender, EventArgs e)
{
Response.Redirect("Default.aspx?msg=work");
}
private void Submit_Add(object sender, EventArgs e)
{
Response.Redirect("Default.aspx?msg=gone");
}
Upvotes: 3
Views: 45026
Reputation: 148
Use the following code
Button1.Attributes.Add("OnClick","btn_Click");
or
Button1.Click += new EventHandler(btn_Click);
This is the button click method
protected void btn_Click(object sender, EventArgs e)
{
do anything...
}
Upvotes: 10
Reputation: 62260
If you want to attach button's event dynamically, you want to use button's CommandName, and catch the event in ItemCommand event.
The main advantage is that you can capture which row is clicked.
protected void Dl1_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
....
Button SignupButton = (Button)e.Item.FindControl("SignupButton");
if (Attending == 0)
{
SignupButton.Text = "Attend";
SignupButton.Attributes.Add("class", "btn btn-large btn-success");
SignupButton.CommandName = "Attend";
}
else
{
SignupButton.Text = "Remove";
SignupButton.Attributes.Add("class", "btn btn-large btn-danger");
SignupButton.CommandName = "Remove";
}
}
}
protected void Dl1_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "Attend")
{
Response.Redirect("Default.aspx?msg=work");
}
else if (e.CommandName == "Remove")
{
Response.Redirect("Default.aspx?msg=gone");
}
}
Upvotes: 1