【问题标题】:Disable EventValidation for single control, is it possible?禁用单个控件的 EventValidation,可以吗?
【发布时间】:2010-01-11 13:37:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net eventvalidation


    【解决方案1】:

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

    public Class DynamicDropDownList : DropDownList
    {
    }
    

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

    【讨论】:

    • 我从事 SO 4 年以上。这是我见过的“可怕的答案”和“精彩的答案”最好的碰撞。这个答案需要一个“捐赠”按钮。
    • 我只是花时间研究 JustDecompile 中的验证代码以找到一种方法——我想出了同样的事情。应该知道先检查 SO。顺便说一句,我同意 w/lance,需要一个“捐赠”按钮。 :-)
    • 这个答案听起来很有希望,但你能举个例子说明我如何实现它。如何放置在我的 .ascx Web 控件上?在 Windows 窗体中,我可以创建一个继承自 DropdownList 的用户控件,但 ascx 要求您继承自 System.Web.UI.UserControl。这是否意味着我必须通过代码添加这个,而不是放在 ascx 页面上?
    • NM - 我想通了。仅供参考(以防有人想知道)。创建了一个单独的 ASP.NET 服务器控件项目(请参阅:msdn.microsoft.com/en-us/library/vstudio/…)并将我将在 ASCX 页面上使用的所有典型 WebControl 子类化。然后我回到 ascx web 控制解决方案,并将服务器控制项目添加为现有项目,然后从 ascx web 控制项目中引用它。然后我可以将新的子类控件添加到 ASCX 页面,并且可以避免事件验证,而无需担心页面或站点设置。
    【解决方案2】:

    另一种处理方式:

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

    推理:如果您使用 JavaScript 在 ASP.NET 的控制之外更改此值,那么此时 ViewState 只会妨碍您。停止将其用于该控件。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 在尝试了不同的事情之后,我对我的问题得出了相同的答案。
      【解决方案4】:

      我发现用具有 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);
          } 
      

      【讨论】:

      • 如果您阅读了这个问题,我知道这种方法。但是意味着在控件呈现之前知道将在客户端添加的值,我不知道。
      • +1 建议使用通用的 HTML 等效项。好主意!
      • 当您尝试检索 PostBack 上的值并且您正在使用 MasterPages 时,ID 将不仅仅是“ID”。要获取值,您可以尝试 Request.Form[Request.Form.AllKeys.First(x => x.Contains("id"))]
      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多