我有一个带有删除按钮的嵌套转发器。此按钮可从组中删除学生。但当我按下删除按钮时,它再次通过嵌套的转发器,我得到:
Invalid postback or callback argument.
堆栈追踪:
[ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> 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.]
System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +9714590
System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +111
System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +29
System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724
我的asp.net文件:
<!-- Begin modal -->
<asp:Repeater ID="RepeaterModal" OnItemDataBound="RepeaterModal_ItemDataBound" runat="server">
<HeaderTemplate>
<div id="modal">
</HeaderTemplate>
<ItemTemplate>
<div id="dialog<asp:Literal ID='ltlModalNumber' runat='server' />" class="window">
<div class="contents">
<h3>Students in group <asp:Literal ID="ltlModalGroup" runat="server" /></h3>
<ul>
<asp:Repeater ID="repeaterModalStudentList" Runat="server">
<ItemTemplate>
<li class="modalStudent"><%# Eval("Name") %></li>
<li class="modalStudentClassDelete">
<asp:ImageButton ID="imgDeleteStudent" runat="server" ImageUrl="styles/img/icons/2.png" CommandName="deleteStudent" OnClick="btnDeleteStudent_Click" ToolTip="Delete this student" />
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
<a href="#" class="close">Close</a>
</div>
</div>
</ItemTemplate>
<FooterTemplate>
</div>
</FooterTemplate>
</asp:Repeater>
<!-- End modal -->
在我的代码隐藏文件中,我做了:
//A field
int r = 0;
//Populates the table with the list of groups.
RepeaterModal.DataSource = listOfGroups;
RepeaterModal.DataBind();
listOfGroups包含一个列表,其中的Group对象包含group_Id,name,code,Students对象,其中包含学生姓名的字符串。
//Repeater methode to put the values in the correct labels of the modal window
public void RepeaterModal_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
//Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
((Literal)e.Item.FindControl("ltlModalNumber")).Text = ((Groups)e.Item.DataItem).Group_Id.ToString();
((Literal)e.Item.FindControl("ltlModalGroup")).Text = ((Groups)e.Item.DataItem).Code.ToString();
//Fill the repeater inside the repeater with the students name
Repeater repeaterModalStudentList = ((Repeater)e.Item.FindControl("repeaterModalStudentList"));
repeaterModalStudentList.DataSource = ((Groups)e.Item.DataItem).Students;
repeaterModalStudentList.DataBind();
ImageButton imgDeleteStudent = repeaterModalStudentList.Items[0].FindControl("imgDeleteStudent") as ImageButton;
if (imgDeleteStudent != null) {
imgDeleteStudent.CommandArgument = ((Groups)e.Item.DataItem).Students[r].Student_Id.ToString();
r++;
}
}
}
protected void btnDeleteStudent_Click(object sender, EventArgs e) {
ImageButton b = (ImageButton)sender;
string value = b.CommandArgument;
Students student = new Students();
student.DeleteStudent(int.Parse(value));
Response.Redirect(Request.RawUrl);
}
我一直错过或做错了,我一直收到这个错误?添加EnableEventValidation不是解决方案。这与commandArgument有关。
大声笑,如果(!IsPostBack)添加,则不再出现错误。但是CommandArgument中没有值。
答案 0 :(得分:2)
您正在分配CommandArgument,但您的方法是btnDeleteStudent_Click
更新
//Repeater methode to put the values in the correct labels of the modal window
public void RepeaterModal_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
//Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
((Literal)e.Item.FindControl("ltlModalNumber")).Text = ((Groups)e.Item.DataItem).Group_Id.ToString();
((Literal)e.Item.FindControl("ltlModalGroup")).Text = ((Groups)e.Item.DataItem).Code.ToString();
//Fill the repeater inside the repeater with the students name
Repeater repeaterModalStudentList = ((Repeater)e.Item.FindControl("repeaterModalStudentList"));
repeaterModalStudentList.DataSource = ((Groups)e.Item.DataItem).Students;
repeaterModalStudentList.DataBind();
repeaterModalStudentList.ItemDataBound += repeaterModalStudentList_ItemDataBound;
}
}
//Repeater methode to put the values in the correct labels of the modal window
public void repeaterModalStudentList_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
//Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
ImageButton imgDeleteStudent = repeaterModalStudentList.Items[0].FindControl("imgDeleteStudent") as ImageButton;
if (imgDeleteStudent != null) {
imgDeleteStudent.CommandArgument = ((Student)e.Item.DataItem).Student_Id.ToString();
}
}
}
protected void btnDeleteStudent_Click(object sender, EventArgs e) {
ImageButton btn = (ImageButton)sender;
int studentId = (int)btn.CommandArgument;
Students student = new Students();
student.DeleteStudent(studentId);
Response.Redirect(Request.RawUrl);
}