【发布时间】:2010-08-01 06:53:04
【问题描述】:
我想扩展 asp.net 验证器,以便我可以使一个验证器依赖于另一个验证器。我的情况是我们必须验证文本框中的日期。通常我会使用RequiredFieldValidator(确保提供日期)、CompareValidator(确保日期是日期)和 RangeValidator(确保日期在要求的限制内)的组合。
这样做的问题是验证器不相互依赖,因此用户可能会同时看到每个验证器的所有三个消息,而我们真正希望他们看到的是最相关的消息,即如果他们在日期文本框中输入“abc”,则不适合向他们显示日期不在有效范围内的消息(尽管从技术上讲,我认为这是真的)。
目前,为了提供这种功能,我们使用 CustomValidator 并将所有三个验证放在服务器验证事件处理程序中,并根据验证失败以编程方式更改错误消息。
我想把它标准化一点,因为它在这个应用程序中发生了很多,我想如果我可以让验证器相互依赖,这将解决问题并允许我们利用客户端验证,而不必进行回发,尤其是处理自定义验证。
这个想法是,如果一个验证器依赖于另一个验证器,如果该“主”有效,那么被依赖的验证器将执行其正常验证(EvaluateIsValid()),否则如果主验证器无效,则其他依赖验证器将有效.
我通过继承框架中已经提供的各种验证器控件提出了以下解决方案。
public class RequiredFieldDependentValidator : RequiredFieldValidator
{
[Description("The validation control to depend on for determining if validation should occur")]
public string ValidationControlToDependOn
{
get
{
object obj = ViewState["ValidationControlToDependOn"];
if (obj != null) return (string) obj;
return null;
}
set
{
Control control = FindControl(value);
if (control is IValidator)
ViewState["ValidationControlToDependOn"] = value;
else
throw new HttpException("ValidationControlToDependOn is not a validation control");
}
}
protected override bool EvaluateIsValid()
{
IValidator validationControlToDependOn = FindControl(ValidationControlToDependOn) as IValidator;
if(validationControlToDependOn != null)
{
return !validationControlToDependOn.IsValid || base.EvaluateIsValid();
}
return base.EvaluateIsValid();
}
目前我刚刚为RequiredFieldValidator编写了代码,理想情况下我想为所有验证器提供此功能,但如果不将上述代码复制到每个单独类型的验证器的类似类中,我看不到这样做的方法我想提供此功能,因此如果有任何问题,我将不得不返回并单独更改每个验证器类型的此代码。
有没有一种方法可以让我“集中”这段代码并在验证器中轻松使用它,而不必从头开始编写整个验证器,这样我就可以更改它们从更远的地方继承的类。
干杯,
【问题讨论】:
标签: asp.net validation