【发布时间】:2010-01-11 13:37:40
【问题描述】:
我知道这是一个备受争议的话题,通常当您考虑将此作为解决方案时,您可能需要重新考虑您的 UI 逻辑。
我知道我可以使用 ClientScriptManager.RegisterForEventValidation 通过验证。但是,我真的很想知道。是否可以删除单个控件的事件验证?有没有办法解决这个问题?
我在渲染后从客户端修改 DropDownList。
【问题讨论】:
我知道这是一个备受争议的话题,通常当您考虑将此作为解决方案时,您可能需要重新考虑您的 UI 逻辑。
我知道我可以使用 ClientScriptManager.RegisterForEventValidation 通过验证。但是,我真的很想知道。是否可以删除单个控件的事件验证?有没有办法解决这个问题?
我在渲染后从客户端修改 DropDownList。
【问题讨论】:
SupportsEventValidation 属性不会为子类继承,因此如果您创建 DropDownList 的子类,不要将该属性应用于子类,并在页面上使用子类,您将拥有一个不会触发事件的控件验证,即使页面上启用了事件验证。
public Class DynamicDropDownList : DropDownList
{
}
【讨论】:
另一种处理方式:
在特定元素上设置属性EnableViewState="False"。
推理:如果您使用 JavaScript 在 ASP.NET 的控制之外更改此值,那么此时 ViewState 只会妨碍您。停止将其用于该控件。
【讨论】:
您的问题的简短回答是:不,没有办法做到这一点。您必须禁用整个页面的 EventValidation。
有多种解决方法...如果您真的不想禁用 EventValidation,请将所选值存储在隐藏字段中并恢复 DropDownList 的状态(或者可能只是清除选择?)。
如果您需要在客户端添加所有值,则无论如何都必须使用其他方法将它们发送出去,因为它们不会出现在服务器端控件中。这些值没有发布!
【讨论】:
我发现用具有 runat="server" 的 HTML 等效项替换控件更容易,然后您可以使用 Request.Forms["id"] 以旧方式检索值。不会进行验证,因此在存储或处理数据时要小心。
另一个选项是覆盖页面上的渲染并使用 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);
}
【讨论】: