我有一个用户控件,我在代码隐藏中的Page.EnableEventValidation = false
事件中成功设置了Page_Init
(为了将页面标记呈现为字符串):
MyControl.ascx.cs
protected void Page_Init(object sender, EventArgs e)
{
if (Request.Form["__EVENTTARGET"] != null
&& Request.Form["__EVENTTARGET"] == btnPrint.ClientID.Replace("_", "$"))
{
Page.EnableEventValidation = false;
}
}
但是,当我尝试在单独的页面上复制此功能时(这次是在runat=server
脚本标记中)...
MyPage.aspx
<script runat="server">
protected void Page_Init(object sender, EventArgs e)
{
if (Request.Form["__EVENTTARGET"] != null
&& Request.Form["__EVENTTARGET"] ==
btnDownloadPDF.ClientID.Replace("_", "$"))
{
Page.EnableEventValidation = false;
}
}
</script>
...我收到以下错误:
'EnableEventValidation'属性只能在页面中设置 指令或在配置部分。
现在,在我的第一个示例中,我最初尝试在Page_Load
上执行此操作时收到此错误;但是,只要在Page_Init
期间(或之前)完成,就可以 以编程方式禁用事件验证。不幸的是,这在我的第二个例子中不起作用。
为什么这在一个场景中起作用而在另一个场景中起作用?它与代码不在代码隐藏中的事实有关吗?
答案 0 :(得分:5)
出于安全原因,通常使用Page.EnableEventValidation = false
是一个坏主意。
相反,您应该查看Page.ClientScript.RegisterForEventValidation
例如:
protected override void Render(HtmlTextWriter writer)
{
Page.ClientScript.RegisterForEventValidation(btnDownloadPDF.UniqueID);
base.Render(writer);
}
这将注册事件参考并允许事件触发。然后你可以离开Page.EnableEventValidation = true
。
从MSDN检查this example。