Чтобы расширить решение @Anders, используя подход CustomValidator
, вы можете очень легко получить значение стандартного HiddenField
элемента управления, сначала найдя элемент управления, приведя его, а затем используя его UniqueID
для просмотраего значение в Page.Request.Form[]
.
Пример 1. Улучшение валидатора сравнения
Этот пример может быть немного более локальным для вашей реализации.Ниже приведена улучшенная версия вызова метода CompareValidator.EvaluateIsValid()
, чтобы добавить поддержку для проверки элементов управления HiddenField
.Обратите внимание, что этот метод может быть применен к любому валидатору, вместо того, чтобы заключить HiddenField
в пользовательский элемент управления, но метод ControlPropertiesValid
также должен быть переопределен, чтобы распознавать и возвращать true при наличии HiddenField
.
...
private new string GetControlValidationValue(string id)
{
var control = this.NamingContainer.FindControl(id);
if (control != null)
{
if (control is HiddenField)
{
return Page.Request.Form[((HiddenField)control).UniqueID];
}
else
{
return base.GetControlValidationValue(id);
}
}
}
protected override bool EvaluateIsValid()
{
// removed 'base.' from the call to 'GetControlValidationValue'
string controlValidationValue = GetControlValidationValue(base.ControlToValidate);
if (controlValidationValue.Trim().Length == 0)
{
return true;
}
bool flag = (base.Type == ValidationDataType.Date) && !this.DetermineRenderUplevel();
if (flag && !base.IsInStandardDateFormat(controlValidationValue))
{
controlValidationValue = base.ConvertToShortDateString(controlValidationValue);
}
bool cultureInvariantRightText = false;
string date = string.Empty;
if (this.ControlToCompare.Length > 0)
{
//same as above
date = GetControlValidationValue(this.ControlToCompare);
if (flag && !base.IsInStandardDateFormat(date))
{
date = base.ConvertToShortDateString(date);
}
}
else
{
date = this.ValueToCompare;
cultureInvariantRightText = base.CultureInvariantValues;
}
return BaseCompareValidator.Compare(controlValidationValue, false, date, cultureInvariantRightText, this.Operator, base.Type);
}
...
Пример 2. Пользовательский динамический валидатор
Этот пример немного сложнее, чем первый.Я регулярно использую настраиваемые динамические валидаторы, которые включаются или отключаются на основе значения другого элемента управления на странице (например, если этот флажок установлен, то это текстовое поле является обязательным; в противном случае его не нужно проверять).Одним из таких валидаторов является мой DynamicRequiredFieldValidator
, который наследуется от встроенного RequiredFieldValidator
.Динамический валидатор имеет два пользовательских атрибута, ControlThatEnables
и ControlValueThatEnables
, которые используются для определения, должен ли валидатор быть включен.Ниже приведен фрагмент метода, который определяет, следует ли включать валидатор, но обратите внимание, что, как и выше, этот же метод можно применять для проверки HiddenField
без необходимости переноса его в пользовательский элемент управления.
...
var enablingControl = this.NamingContainer.FindControl(ControlThatEnables);
if (enablingControl != null)
{
if (enablingControl is HiddenField)
{
var hfValue = Page.Request.Form[((HiddenField)enablingControl).UniqueID];
isValidatorEnabled = hfValue == ControlValueThatEnables;
}
}
...
Заключительные мысли
Решение о реализации в конечном итоге остается за вами, как за разработчиком, но я предпочитаюзаключать существующие валидаторы в пользовательские элементы управления, а не в такие элементы, как HiddenFields
, TextBoxes
, DropDownLists
и т. д. в пользовательские элементы управления.У меня есть две основные причины, по которым я предпочитаю это решение: (1) упаковка валидаторов занимает всего несколько минут больше, чем просто добавление ValidationProperty
, но обеспечивает значительно большую гибкость и возможность для дальнейшего улучшения валидации .NET, например, можно указатьFindControl
вызывает некоторый пользовательский метод, который ищет нужный идентификатор элемента управления в текущем NamingContainer
(по умолчанию), а затем расширяет поиск до внешнего Page
или родительского элемента NamingContainer
, если элемент управления не был найден;(2) ИМХО, если кто-то пытается улучшить валидацию, чище вносить улучшения в валидацию, и, наоборот, если кто-то пытается улучшить WebControl
, он чище вносит улучшения в WebControl
.
Я полностью уважаю решение @ Скотти и буду первым, кто признает, что если это единственное изменение, которое будет сделано, то его решение сэкономит вам на 5 минут больше, чем это.ИМХО, однако, @Anders ', вероятно, будет лучшим выбором в долгосрочной перспективе.