【问题标题】:Using ASP.NET validators to validate Composite Control data使用 ASP.NET 验证器来验证复合控件数据
【发布时间】:2013-03-19 21:32:59
【问题描述】:

背景:我有一个用于构建表单的 CompositeControls 工具集。控件本身与一些用于基本验证任务的 jquery 验证相关联。

问题:我想通过允许开发人员使用 ASP.NET 验证器(即 RegExValidator、RequiredFieldValidator、CustomValidator 等)来验证其中之一中的数据,从而使这些 CompositeControls 的验证更加灵活我的 CompositeControls。

示例:我希望开发人员能够执行以下操作:

<asp:ValidationSummary runat=server HeaderText="There were errors on the page:" />

<custom:TextBox id='SomeTextBox' Label='Enter Name Here:' text='' runat='server' />

<asp:RequiredFieldValidator runat=server ControlToValidate=SomeTextBox ErrorMessage="Name is required."> *
</asp:RequiredFieldValidator>

我已将“ValidationProperty”添加到复合文本框,但RequiredFieldValidator(或任何其他验证器)似乎无法识别文本框或来自它的数据。文本框(以及我构建的所有其他自定义 CompositeControls)继承 CompositeControl,将属性“ValidationProperty”设置为公开控件数据元素的公共属性,并且还包含“字符串 ValidationGroup”属性。

问题:有谁知道复合控件还需要什么或具体需要什么才能很好地与 ASP.NET 验证器配合使用(我宁愿避免在复合控件中包含所有验证器类型的实例, 除非当然有必要)?

【问题讨论】:

  • 看来我遇到的实际问题与复合控件本身无关,而是复合控件包含在我开发的自定义包装控件中。 .net 将复合控件视为包装控件的子控件,因此不在页面级别(这就是验证器没有重新识别它的原因)。为了解决这个问题,我从 WebControl 而不是 CompositeControl 继承了控件并实现了 IValidator (替代方案也是继承 BaseValidator)。这似乎工作得很好,并且仍然保持我正在寻找的灵活性。

标签: asp.net validation


【解决方案1】:

我上次研究这个问题是在 2005 年左右,但据我记得,这里有两个不同的问题:

  1. 客户端验证代码如何找到要验证的值
  2. 服务器端验证如何找到要验证的值

如果我没记错的话,设置ValidationProperty 只会影响服务器端验证。如果您还没有,请检查验证器的IsValid 属性是否在您回发后在服务器端设置为false

这可能已经改变,但我认为验证控件只能验证与它们具有相同命名容器的控件也是正确的。

在客户端,我有点模糊,但我认为情况仍然是验证脚本将查找客户端 ID 对应于它被告知要查找的服务器 ID 的元素,并查找一个value 属性。如果您没有在客户端公开一个,它将无法找到任何要验证的内容。

如果您有时间,逐步完成验证 javascript 会很有帮助。这将教你很多关于客户端验证如何找到它验证的值的知识。

希望这会有所帮助。

【讨论】:

  • 看来我遇到的实际问题与复合控件本身无关,而是控件包含在包装控件中。我认为 ASP.net 认为复合控件不在页面级别,因此 .net 验证器无法识别它。您使用 ValidationProperty 装饰复合控件的解决方案有效(也很高兴知道分配给此装饰器的属性必须返回一个字符串而不是布尔值)。处理验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2011-02-22
  • 1970-01-01
  • 2012-12-02
相关资源
最近更新 更多