Что определяет порядок запуска валидаторов? - PullRequest
2 голосов
/ 15 июля 2010

У меня есть веб-форма с двумя пользовательскими валидаторами:

  • Один, чтобы проверить, что строка является датой. Мне все равно, какой формат, если он разбирается.
  • Другой, чтобы гарантировать, что одна дата равна или больше другой. Я просто не мог заставить валидатор сравнения хорошо играть с любым форматом даты.
<asp:TextBox ID="txtResourceStartDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceStartDateIsDate" runat="server"
    ControlToValidate="txtResourceStartDate" Display="None"
    ErrorMessage="Start date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:TextBox ID="txtResourceEndDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceEndDateIsDate" runat="server"
    ControlToValidate="txtResourceEndDate" Display="None"
    ErrorMessage="End date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:CustomValidator Display="None" Text="" ID="valForStartEndDate" runat="server"
    OnServerValidate="ValidateStartEndDate"
    ErrorMessage="Last day must be greater than or equal to first day" />
protected void Date_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime outDate;
    args.IsValid = DateTime.TryParse(args.Value, out outDate);
}

protected void ValidateStartEndDate(object sender, ServerValidateEventArgs e)
{
    e.IsValid = DateTime.Parse(txtResourceEndDate.Text) >=
                DateTime.Parse(txtResourceStartDate.Text);
}

Проблема в том, что валидатор ValidateStartEndDate запускается перед валидатором Date_ServerValidate, поэтому, если дата недействительна, исключение формата выдается на DateTime.Parse. Очевидно, этот валидатор может проверять правильность даты перед синтаксическим анализом, но я бы предпочел иметь дискретный валидатор с соответствующим сообщением.

Итак, вопрос в следующем: что определяет последовательность, с которой запускаются валидаторы? Если я что-то не упустил, это не объявляется на уровне тегов.

Ответы [ 2 ]

1 голос
/ 15 июля 2010

Вы не можете рассчитывать на определенную последовательность, которую сработают валидаторы, а также нет.Вы должны убедиться, что порядок не имеет значения.

Таким образом, вы можете

  1. проверять действительную дату одновременно с Equal-Greater-Check.
  2. Сначала вызвать Validate вашего IsDate-Validator () - Функция изатем проверьте, является ли он IsValid
  3. Все валидаторы добавляются в коллекцию Page.Validators, и проверка проходит через эту коллекцию по порядку.Если ваша логика действительно должна опираться на этот порядок: измените порядок валидаторов в ASPX-Page

Некоторые интересные сведения о Page-валидации: http://msdn.microsoft.com/en-us/library/aa479045.aspx

0 голосов
/ 09 июня 2014

Порядок выполнения контроля валидации определяется порядком элементов управления в ValidatorCollection, возвращаемом Page.Validators. Этот порядок, в свою очередь, определяется порядком элементов управления валидацией в разметке, за некоторыми исключениями (например, валидаторы в элементах управления с привязкой к данным будут добавлены в коллекцию позже, и поэтому будут в конце).

Если вы установите CausesValidation=false для своей кнопки и затем запустите проверку вручную с помощью Page.Validate, вы можете использовать методы Add и Remove в ValidatorCollection, чтобы изменить порядок выполнения :

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) {
        // move myValidator to the very end, so it executes last
        Validators.Remove(myValidator);
        Validators.Add(myValidator);
    }
}

Затем, позже, в триггерном управлении:

protected void myButton_Click(object sender, EventArgs e)
{
    Page.Validate();
    if (!Page.IsValid) { return; }

    // validation passed, proceed...
}

Отказ от ответственности: все это эмпирически, я не нашел документов MSDN, чтобы подтвердить это, но, похоже, это работает.

...