有没有一种优雅的方法可以使用ASP.NET验证器比较复选框和文本框?

时间:2020-03-06 14:19:14  来源:igfitidea点击:

我有一个Asp.Net中继器,其中包含一个文本框和一个复选框。我需要添加客户端验证,以验证选中此复选框时,文本框只能接受零或者空白值。

我想使用一个或者多个Asp.Net的验证器控件来完成此操作,以提供一致的客户端错误显示(服务器端错误由另一个子系统处理)。

Asp:CompareValidator似乎不够灵活,无法执行这种复杂的比较,因此我只看Asp:CustomValidator。

我遇到的问题是似乎没有任何方法可以将自定义信息传递给验证功能。这是一个问题,因为我在运行时不知道复选框和文本框的ClientId(因为它们是Repeater的一部分)。

所以...我的选择似乎是:

  • 将文本框和复选框以某种方式传递给CustomValidator(似乎不可能)。
  • 根据CustomValidator传递的参数,通过JavaScript查找TextBox。如果ClientId含糊不清怎么办?
  • 完全忘记验证,并发出自定义JavaScript(允许我将两个ClientId都传递给自定义函数)。

有什么想法可能是实现此目标的更好方法?

解决方案

我们不能将CustomValidator放在转发器内吗?如果没有,我们可以在绑定转发器并且用户使用FindControl()时动态创建它

protected MyDataBound(object sender, RepeaterItemEventArgs e) {
  (CheckBox)cb = (CheckBox)e.Item.FindControl("myCheckboxName");
  (TextBox)tb = (TextBox)e.Item.FindControl("myTextBox");
}

...或者类似的东西。我从头顶上写了代码。

我认为最好的方法是在新类中继承BaseValidator,并将这些ID作为属性传递给控件。我们应该能够解析验证器中的ID,而无需知道在运行时生成的完整客户端ID。我们应该首先在服务器上验证数据,然后在客户端上验证数据。