0

我有一个用户控件,我已在代码隐藏中成功设置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;
    }
}

但是,当我尝试在单独的页面上复制此功能时(这次是在runat=server脚本标签中)...

我的页面.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。不幸的是,这在我的第二个示例中不起作用。

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

4

1 回答 1

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检查这个例子。

于 2013-04-22T12:48:43.280 回答