设置页面.在Page_Init上启用eventvalidation

本文关键字:Init 启用 eventvalidation Page 设置 | 更新日期: 2023-09-27 18:10:31

我有一个用户控件,我已经成功地在代码隐藏的Page_Init事件中设置了Page.EnableEventValidation = false(为了将页面标记呈现为字符串):

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期间完成的。不幸的是,在我的第二个例子中,同样的方法不起作用。

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

设置页面.在Page_Init上启用eventvalidation

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

你应该看看Page.ClientScript.RegisterForEventValidation

例如:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation(btnDownloadPDF.UniqueID);
    base.Render(writer);
}

这将注册事件引用并允许事件触发。然后你可以留下Page.EnableEventValidation = true

从MSDN查看此示例