删除按钮 - 无效的回发或回调参数

时间:2012-02-07 12:13:53

标签: c# asp.net

我正在尝试在我的产品页面添加“删除”按钮,但我一直遇到此错误的麻烦:

错误:

  

无效的回发或回调参数。事件验证已启用   在配置中使用或<%@   Page EnableEventValidation =“true”%>在一个页面中。为了安全   目的,此功能验证回发或回调的参数   事件源自最初呈现的服务器控件   他们。如果数据有效且预期,请使用   ClientScriptManager.RegisterForEventValidation方法   注册回发或回调数据以进行验证。

     

堆栈追踪:

     

[ArgumentException:无效的回发或回调参数。事件   使用in启用验证   配置或<%@ Page EnableEventValidation =“true”%>在一个页面中。   出于安全考虑,此功能会验证参数   回发或回调事件源自服务器控件   最初渲染它们。如果数据有效且预期,请使用   ClientScriptManager.RegisterForEventValidation方法   注册回发或回调数据以进行验证。]
  System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId,   字符串参数)+8730646
  System.Web.UI.Control.ValidateEvent(String uniqueID,String   eventArgument)+113
  System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串   eventArgument)+35
  System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串   eventArgument)+10
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler   sourceControl,String eventArgument)+13
  System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)   +36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   5563

我尝试了什么:

在整个研究过程中,我了解到我可以使用enableEventValidation="false"validateRequest="false",但由于安全原因,我不建议这样做。 我试图将两者都设置为False,它修复了问题(我认为我没有插入DELETE查询),但是我不满意关闭一些安全设置,只是为了摆脱错误。 / p>

我的转发器位于Page_Load内部,由于我正在使用母版页,转发器也处于一种形式。

.aspx的:

<asp:Repeater runat="server" ID="RepProductMenu" OnItemCommand="RepProducts_ItemCommand">
<ItemTemplate>
         [Lots of stuff]......

        <asp:Button ID="BtnDelete" runat="server" Text="Delete" CommandName="Delete" CommandArguement='<%# Eval("ID") %>' /

</ItemTemplate>
</asp:Repeater>

Aspx.cs:

protected void RepProducts_ItemCommand(Object Sender, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        int ID = Int32.Parse(e.CommandArgument.ToString());
        // Add Delete Query
        Response.Write("COMMAND");
    }
}

任何建议和内容都表示赞赏。

3 个答案:

答案 0 :(得分:9)

避免将Delete用作CommandName,因为我认为这是保留的。

您的Button控件中也有拼写错误。 CommandArguement应为CommandArgument


如果您的转发器在Page_Load而非if !(page.IsPostBack)内绑定,那么当点击Delete按钮时它将被反弹。这可能会导致问题,因为转发器将在ItemCommand运行之前反弹。哪会使它无效。

尝试更改代码,以便if !(page.IsPostBack)围绕绑定。

答案 1 :(得分:2)

好的,我发现了这个问题并且无法正常工作。我将提供我的新代码,希望它可以帮助你以及:)请记住,我在我的代码隐藏中使用DataAccess所以你应该在那里输入你自己的代码,但是,看一看:

**

旧代码:

**

<asp:Repeater runat="server" ID="RepProductMenu" OnItemCommand="RepProducts_ItemCommand">
<ItemTemplate>
      <asp:Button ID="BtnDelete" runat="server" Text="Slet" CommandName="DeleteProduct" CommandArgument='<%# Eval("ID") %>' />
</ItemTemplate>
</asp:repeater>



 protected void RepProducts_ItemCommand(Object Sender, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "DeleteProduct")
        {
            int ID = Int32.Parse(e.CommandArgument.ToString());
            // Add Delete Query
            Response.Write("COMMAND");
        }
    }      

首先,它不应该是RepeaterCommandEventArgs,而是CommandEventArgs

**

新代码:

**

<asp:Repeater runat="server" ID="RepProductMenu" >
<ItemTemplate>
      <asp:Button ID="BtnDelete" runat="server" Text="Slet" CommandName="DeleteProduct" CommandArgument='<%# Eval("ID") %>' />
</ItemTemplate>
</asp:repeater>

protected void OnItemCommand(Object Sender, CommandEventArgs e)
{
    if (e.CommandName == "DeleteProduct")
    {
        DataAccess dataAccess = new DataAccess();

        int ID = Int32.Parse(e.CommandArgument.ToString());
        dataAccess.AddParameter("@id", ID);
        dataAccess.Execute(@"DELETE FROM [Product] WHERE ID = @ID");
        //Response.Write("COMMAND");
    }
}

答案 2 :(得分:2)

对我来说,问题是转发器在Page_Load方法中的数据绑定需要放在'if(!IsPostBack)'块中。

而不是:

protected void Page_Load(object sender, EventArgs e)
{
    FileLinksRepeater.DataSource = _DataSource;
    FileLinksRepeater.DataBind();
}

试试这个:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        FileLinksRepeater.DataSource = _DataSource;
        FileLinksRepeater.DataBind();
    }   
}

这解决了我的问题。