C# 嵌套控件中的Imagebutton删除操作

C# 嵌套控件中的Imagebutton删除操作,c#,asp.net,nested-repeater,C#,Asp.net,Nested Repeater,我有一个嵌套的中继器,里面有一个删除按钮。此按钮从组中删除学生。但当我按下删除按钮时,它只是再次通过嵌套中继器,我得到: Invalid postback or callback argument. 堆栈跟踪: [ArgumentException: Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> i

我有一个嵌套的中继器,里面有一个删除按钮。此按钮从组中删除学生。但当我按下删除按钮时,它只是再次通过嵌套中继器,我得到:

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
listOfGroups包含一个包含组对象的列表,该组对象包含组Id、名称、代码、学生对象以及学生名称字符串

//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有关的

编辑
Lol,如果(!IsPostBack)不再收到错误,则添加。但是CommandArgument中没有值

您正在分配CommandArgument,但您的方法是btnDeleteStudent\u 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); 
} 

组id是否有任何时髦的字符?funky说,我指的是任何会使回发验证失败的字符。不,它只是一个int,例如1、2、9等等。现在我忘记了在我的On_Load方法中是否有(!IsPostBack)。这就是为什么它会重复它。但是仍然得到了错误,imgDeleteStudent只被找到了两次,而它应该被找到了5次。请更正,我不会再得到错误。但还是不行。添加到commandargument的值为空。我想你的意思是他应该订阅ItemCommand,而不是btnDeleteStudent\u Click?你是对的,但这只是一个命名约定,因为我的属性OnClick具有相同的名称。我更新了代码。您可以从aspx页面或代码隐藏(如上面的代码)附加到btnDeleteStudent_命令;否则,参数将不匹配。@Win Yes,您是正确的!我真是太蠢了,我应该意识到这一点,但我当然没有,因为我在网上找到了关于嵌套中继器的东西。像这样:但这只是谈论数据绑定数据源,而不是如何使用onItemDataBound添加自己的额外代码。谢谢你,我的朋友,这是你公认的回答。
//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);
}
//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); 
}