禁用单个控件的EventValidation,是否可能?

时间:2010-01-11 13:37:41

标签: asp.net eventvalidation

我知道这是一个备受争议的话题,通常在您将此视为解决方案时,您可能需要重新考虑您的UI逻辑。

我知道我可以使用ClientScriptManager.RegisterForEventValidation传递验证。但是,我真的很想知道。是否可以删除单个控件的事件验证?有办法解决这个问题吗?

我在渲染后从客户端修改DropDownList。

4 个答案:

答案 0 :(得分:31)

对于子类不继承SupportsEventValidation属性,因此如果您创建DropDownList的子类,不要将该属性应用于子类,并使用页面上的子类,您将拥有一个不触发事件的控件验证,即使在页面上启用了事件验证。

public Class DynamicDropDownList : DropDownList
{
}

http://msdn.microsoft.com/en-us/library/system.web.ui.supportseventvalidationattribute%28v=VS.110%29.aspx

答案 1 :(得分:4)

另一种处理此问题的方法:

在特定元素上设置属性EnableViewState="False"

推理:如果您使用JavaScript在ASP.NET控件之外更改此值,那么ViewState就会妨碍您的操作。停止使用它进行控制。

答案 2 :(得分:3)

我发现使用与runat =“server”等效的HTML替换控件更容易,然后可以使用Request.Forms [“id”]检索旧方式的值。将不会进行验证,因此请小心存储或处理数据。

另一个选项是覆盖页面上的Render并使用Page.ClientScript.RegisterForEventValidation以及所有可能的答案(不太好)。  像这样的东西

    protected override void Render(HtmlTextWriter writer)
    {
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "a");
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "b");
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "c");
        base.Render(writer);
    } 

答案 3 :(得分:3)

对你的问题的简短回答是:不,没有办法做到这一点。您必须为整个页面禁用EventValidation。

有各种解决方法......如果您确实不想禁用EventValidation,请将所选值存储在隐藏字段中并恢复DropDownList的状态(或者只是清除选择?)。

如果您需要在客户端添加所有值,则无论如何都必须使用其他方法发送它们,因为它们不会出现在服务器端控件中。这些值没有发布!