在Page_Init上设置Page.EnableEventValidation

时间:2013-04-22 11:54:17

标签: c# asp.net webforms

我有一个用户控件,我在代码隐藏中的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期间(或之前)完成,就可以 以编程方式禁用事件验证。不幸的是,这在我的第二个例子中不起作用。

为什么这在一个场景中起作用而在另一个场景中起作用?它与代码不在代码隐藏中的事实有关吗?

1 个答案:

答案 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