我正在尝试在我的产品页面添加“删除”按钮,但我一直遇到此错误的麻烦:
无效的回发或回调参数。事件验证已启用 在配置中使用或<%@ 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内部,由于我正在使用母版页,转发器也处于一种形式。
<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>
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");
}
}
任何建议和内容都表示赞赏。
答案 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();
}
}
这解决了我的问题。