3 votes

ASP.NET WebForms : Validation en court-circuit

J'ai une zone de texte en grille que je valide :

<telerik:RadTextBox ID="txtMerchMin" runat="server" Text='<%# Bind("MerchandiseMinimumAmount") %>'></telerik:RadTextBox>
                    <asp:RequiredFieldValidator ID="required" runat="server" ErrorMessage="* required" ControlToValidate="txtMerchMin"></asp:RequiredFieldValidator>
                    <asp:CompareValidator runat="server" ID="isNumbers" Type="Double" Operator="DataTypeCheck" ControlToValidate="txtMerchMin" ErrorMessage="* must be numeric" />
                    <asp:CompareValidator runat="server" ID="IsNonNegative" Type="Double" Operator="GreaterThanEqual" ControlToValidate="txtMerchMin" AmountToCompare="0" ErrorMessage="* should be non-negative"/>
                    <asp:CompareValidator ID="isLessThanMax" ControlToValidate="txtMerchMin" Type="Double" ControlToCompare="txtMerchMax" Operator="LessThan" Text="* should be less than max" runat="server"></asp:CompareValidator>

J'aimerais que les validations soient exécutées dans l'ordre suivant et qu'elles se comportent de la manière suivante :

  1. Si la validation obligatoire échoue, afficher uniquement le message d'erreur de la validation obligatoire.
  2. Si la validation de isNumbers échoue, afficher uniquement le message d'erreur de isNumber.
  3. Si la validation de isNonNegative échoue, afficher uniquement le message d'erreur de isNonNegative.
  4. Si la validation de isLessThanMax échoue, afficher uniquement le message d'erreur de isLessThanMax. de isLessThanMax.

Dans l'état actuel du code, lorsque la valeur de txtMerchMin n'est pas un nombre, je vois le message d'erreur isNumbers, isNonNegative et isLessThanMax en même temps.

Existe-t-il un moyen de "court-circuiter" la validation pour obtenir le comportement attendu ?

0voto

zhuber Points 2902

Il suffit de créer un CustomValidator qui fonctionne côté serveur et d'utiliser des instructions if/else pour obtenir le comportement souhaité. Par exemple :

<telerik:RadTextBox ID="txtMerchMin" runat="server" Text='<%# Bind("MerchandiseMinimumAmount") %>'></telerik:RadTextBox>
    <asp:RequiredFieldValidator ID="required" runat="server" ErrorMessage="* required" ControlToValidate="txtMerchMin"></asp:RequiredFieldValidator>
    <asp:CustomValidator runat="server" ID="customValidator" Display="Dynamic" SetFocusOnError="true" ControlToValidate="txtMerchMin"></asp:CustomValidator>

Dans le code derrière dans init méthode définie (vous pouvez également le faire dans le balisage)

customValidator.ServerValidate += new ServerValidateEventHandler(customValidator_ServerValidate);

Puis, en fonction, mettez en œuvre votre logique :

protected void customValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    bool isValid = true;

    double price;
    bool isDouble = Double.TryParse(args.Value, out price);
    if(!isDouble) {
      // not double (numeric)
      isValid = false;
    }
    else if (...)
    else if (...)

    args.IsValid = isValid;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X