我遇到的情况是我想要使用的验证功能取决于用户之前在表单中做出的选择。页面加载了默认验证器,如下所示。
CustomValidator cv = new CustomValidator();
cv.ErrorMessage = "You must learn to follow instructions.";
cv.ControlToValidate = "myTextBox";
cv.EnableClientScript = true;
cv.CssClass = "Validator";
cv.ServerValidate += new ServerValidateEventHandler(cv_TextValidator);
cv.ClientValidationFunction = "textValidate";
u.ContentTemplateContainer.Controls.Add(cv);
当用户选择X时,会调用类似timeInterval_SelectedIndexChanged(object sender, EventArgs e)
的内容。当他们做出这个选择时,我需要换掉附加到我的一些控件的验证。在伪代码中,我需要这样的东西:
if user chose the first option {
myControl.clientValidation = "textValidate";
myControl.serverValidation = "cv_TextValidator";
} else {
myControl.clientValidation = "alternateTextValidate";
myControl.serverValidation = "cv_AlternateTextValidator";
}
如何在代码隐藏中替换验证函数?
我知道这可以通过单个验证函数中的if-else块来完成。它也可以通过隐藏和显示已附加备用验证的其他框来完成。 “如果 - 其他验证”和“隐藏事物”似乎是解决问题的非优雅方式。我宁愿将我的功能重新连接到正确的功能。
答案 0 :(得分:0)
ClientValidationFunction是一个字符串,所以只需将其更改为您想要的任何内容:
if (SomeDDL.SelectedValue == "A")
cv.ClientValidationFunction = "ValidateA";
else
cv.ClientValidationFunction = "ValidateB";
可能无法在ViewState中跟踪它,因此您可能必须在每次回发到服务器,Page_load或类似事件(很可能是PreRender或之前)中设置它。
另一方面,只需附加到正确的处理程序:
if (SomeDDL.SelectedValue == "A")
cv.ServerValidate += cv_FirstHandler;
else
cv.ServerValidate += cv_SecondHandler;
为此,你必须在每次回发时都这样做,并且总是从代码而不是标记来做。