#c# #asp.net #.net #validation
#c# #asp.net #.net #проверка
Вопрос:
Мне нужно проверить значение Page.Имеет значение при каждой загрузке / обратной отправке страницы для выполнения какой-либо другой логики.
Однако isValid нельзя вызвать, если страница.Validate() не был вызван.
Страница.Validate() не будет вызываться, если для элемента управления, отправившего ответ, значение CausesValidation равно false.
Если я вызываю страницу.Сам Validate() вызывает отображение всех средств проверки на странице.
В настоящее время у меня есть два решения этой проблемы.
Первый метод, я использую try catch вокруг isValid. Я перехватываю исключение, которое возникнет, если проверка не произошла. Затем я вызываю Page.Выполните проверку, проверьте значение isValid, затем выполните цикл по всем средствам проверки, чтобы пометить их все как действительные, чтобы они не отображались на странице.
bool isValid = false;
try
{
isValid = this.IsValid;
}
catch (System.Web.HttpException exception)
{
if(exception.Message == "Page.IsValid cannot be called before validation has taken place. It should be queried in the event handler for a control that has CausesValidation=True and initiated the postback, or after a call to Page.Validate.")
{
//Validation has NOT occurred so run it here, store the result, then set all the validators to valid.
this.Validate();
isValid = this.IsValid;
foreach (IValidator validator in this.Validators)
{
validator.IsValid = true;
}
}
}
Второй метод заключается в использовании отражения для получения поля _validated с самой базовой страницы. Затем я делаю то же самое, что и первый метод, вызывая Validate, если страница не была проверена, а затем сбрасываю все средства проверки впоследствии.
bool isValidated = (bool)typeof(Page).GetField("_validated", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(this);
bool isValid = false;
if (isValidated)
{
isValid = this.IsValid;
}
else
{
this.Validate();
isValid = this.IsValid;
foreach (IValidator validator in this.Validators)
{
validator.IsValid = true;
}
}
Мне не нравится ни одно из этих решений, поскольку мне не нравится кодирование с помощью исключений, и мне не нравится использовать отражение для доступа к проверенному свойству, поскольку, должно быть, была какая-то причина, по которой оно было закрыто в первую очередь.
У кого-нибудь еще есть лучшие решения или какие-либо идеи?
Комментарии:
1. Это то, что вы должны делать на стороне сервера? Возможно, было бы проще выполнить проверку на стороне клиента при загрузке.
2. @JamesJohnson Код, который я должен запускать на Valid / Invalid, должен выполняться на стороне сервера, да. Хотя, даже если бы это могло быть на стороне клиента, я не вижу, как это помогло бы, поскольку мне все равно нужно было бы проверить, действительна ли страница без запуска / отображения валидаторов.
3. Как насчет использования определенной группы проверки и использования страницы. Перегрузка проверки (строки)?
4. Большое вам спасибо. Возможно, это не идеальный случай для производства, но это действительно помогает устранить загадочный сбой проверки. Пальцы вверх! Лучшие решения — разберитесь с отдельными средствами проверки после того, как выясните, какой из них вызывает проблемы.
5. Потребовалось несколько необразованных догадок, чтобы перевести первую строку второго метода в VB, так что вот она на случай, если кому-то еще это понадобится Dim t Как Type = GetType(Страница), если t.getField(«_validated», System. Отражение. BindingFlags. Экземпляр или система. Отражение. BindingFlags. Непублично). Получить значение (я)
Ответ №1:
Я бы посоветовал вам просто использовать ваши средства проверки с параметром EnableClientScript, установленным в false.
Таким образом, вы сможете вызвать
if (this.Page.IsValid)
в вашем коде.
Если вы хотите проверить определенную группу проверки, просто используйте эту строку на стороне сервера:
Page.Validate("ValidationGroupName")
Посмотрите на эти примеры групповой проверки