在Page_Init上设置Page.EnableEventValidation

Ant*_*t P 0 c# asp.net webforms

我有一个用户控件,我在代码隐藏中成功设置Page.EnableEventValidation = falsePage_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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在单独的页面上复制此功能时(这次是在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>
Run Code Online (Sandbox Code Playgroud)

...我收到以下错误:

'EnableEventValidation'属性只能在页面指令或配置部分中设置.

现在,在我的第一个例子中,我在最初尝试执行此操作时收到此错误Page_Load; 但是,似乎您可以通过编程方式禁用事件验证,只要它在(或之前)完成Page_Init.不幸的是,在我的第二个例子中,这不起作用.

为什么这种情况在一种情况下有效而另一种情况无效?它与代码不在代码隐藏的事实有关吗?

Jac*_*ger 5

Page.EnableEventValidation = false出于安全原因,通常使用是一个坏主意.

相反,你应该看看 Page.ClientScript.RegisterForEventValidation

例如:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation(btnDownloadPDF.UniqueID);
    base.Render(writer);
}
Run Code Online (Sandbox Code Playgroud)

这将注册事件参考并允许事件触发.然后你可以离开Page.EnableEventValidation = true.

从MSDN 检查此示例.