Проверка, является ли страница действительной, даже если значение CausesValidation равно false

#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")
  

Посмотрите на эти примеры групповой проверки