58 votes

En postback, comment puis-je ajouter un message d'erreur au résumé de la validation ?

Deux questions :

En postback, lorsqu'un utilisateur clique sur "submit", comment puis-je ajouter un message d'erreur au résumé de la validation ?

Est-il également possible de mettre en évidence une zone de texte particulière à l'aide des contrôles de validation .net intégrés ?

89voto

NightOwl888 Points 4622

Créez dynamiquement un contrôle CustomValidator et ajoutez-le directement à la collection Page.Validators.

Dim err As New CustomValidator
err.ValidationGroup = "MyGroup"
err.IsValid = False
err.ErrorMessage = "The password is invalid"
Page.Validators.Add(err)

Contrairement à l'ajout du CustomValidator au balisage, cette méthode vous permet d'ajouter un nombre quelconque de messages d'erreur arbitraires basés sur la logique commerciale côté serveur.

Notez que vous pouvez également l'ajouter directement à la page, mais il y a quelques règles à respecter :

  1. Vous devez ajouter le contrôle au même conteneur de nommage que les contrôles du groupe de validation.
  2. Si vous ne voulez pas que le message de validation apparaisse à un endroit aléatoire de la page, vous devrez soit ajouter le validateur à un conteneur spécifique, soit le supprimer à l'aide d'une classe ou d'un style CSS.

Vous pouvez également créer un classe personnalisée et implémenter IValidator qui vous permet d'ajouter le message en une seule ligne de code, mais cette méthode ne prend pas en charge les groupes de validation.

Conformément à la suggestion d'Anders Fjeldstad, voici un ensemble de méthodes d'extension pratiques.

Imports Microsoft.VisualBasic
Imports System.Runtime.CompilerServices

Public Module PageExtensions

    <Extension()> _
    Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String)
        p.AddValidationError(errorMessage, String.Empty)
    End Sub

    <Extension()> _
    Public Sub AddValidationError(ByVal p As System.Web.UI.Page, ByVal errorMessage As String, ByVal validationGroup As String)
        Dim err As New CustomValidator
        err.ValidationGroup = validationGroup
        err.ErrorMessage = errorMessage
        err.IsValid = False
        p.Validators.Add(err)
    End Sub

End Module

4 votes

+1 pour activer un nombre arbitraire de messages d'erreur. De plus, le code ci-dessus pourrait facilement être intégré dans une méthode d'extension de System.Web.UI.Page ou de System.Web.UI.ValidatorCollection, ce qui permettrait de le réutiliser via quelque chose comme Page.AddValiationError("MyValidationGroup", "Some error message").

0 votes

J'ai constaté qu'une fois que j'avais ajouté les validateurs de cette manière (et que je les avais ajoutés à un contrôle sur la page, de sorte que je pouvais contrôler où ils apparaissaient), si je ne définissais pas la balise ControlToValidate propriété, puis je n'ai pas pu changer ce qui rendait la page invalide - et je n'ai donc plus jamais pu soumettre la page. La définition de cette propriété a réglé le problème pour moi.

0 votes

Très utile @NightOwl888. Par commodité, le même code mais en C#. CustomValidator err = new CustomValidator(); err.ValidationGroup = "MyGroup"; err.IsValid = false; err.ErrorMessage = "The Password is Invalid"; Page.Validators.Add(err);

50voto

user53794 Points 2347

Ajoutez un validateur personnalisé et définissez manuellement ses paramètres. IsValid y ErrorMessage propriétés. Un peu comme ça :

<asp:panel ID="ErrorsPanel" runat="server" CssClass="ErrorSummary">
    <asp:CustomValidator id="CustomValidator1" runat="server" 
        Display="None" EnableClientScript="False"></asp:CustomValidator>
    <asp:ValidationSummary id="ErrorSummary" runat="server" 
        HeaderText="Errors occurred:"></asp:ValidationSummary>
</asp:panel>

Dans le code derrière :

//
// Update the database with the changes
//
string ErrorDetails;
if (!Db.Update(out ErrorDetails))
{
    CustomValidator1.IsValid = false;
    CustomValidator1.ErrorMessage = ErrorDetails;
}

6 votes

Un piège ici est que si votre contrôle de résumé de validation spécifie un ValidationGroup, alors vous devez également ajouter un attribut ValidationGroup à votre CustomValidator pour assurer que le message d'erreur est affiché quand/où cela est nécessaire. C'est peut-être juste une question de bon sens, mais cela m'a pris à l'occasion.

7voto

Stefan de Bruijn Points 4187

Voici une petite extension à la bonne idée de NightOwl888 :

public class ValidationError : CustomValidator
{
    public ValidationError(string group, string msg)
        : base()
    {
        base.ValidationGroup = group;
        base.ErrorMessage = msg;
        base.IsValid = false;
    }
}

public static class PageExtensions
{
    public static void ErrorMessage(this Page page, string group, string msg)
    {
        page.Validators.Add(new ValidationError(group, msg));
    }
}

Lorsque vous voulez émettre un message d'erreur, il suffit d'appeler Page.ErrorMessage ; le mécanisme est le même que celui qu'il a suggéré.

0 votes

Peut-être faire le group facultatif, de sorte que si le ValidationSummary n'en définit pas, le ValidationError fonctionnera quand même avec lui.

0 votes

@DanielBallinger Bien sûr... ? Notez que mes exemples de code ne sont pas destinés à être du code de production, juste à illustrer les choses qui peuvent être mises en œuvre - après tout, je ne suis pas ici pour faire le travail des autres comme un service de charité...

1 votes

Désolé, j'aurais dû être plus clair. Je n'avais pas l'intention de vous demander de mettre à jour l'exemple ou quoi que ce soit. Il s'agit plutôt d'une note à l'intention des autres pour qu'ils en tiennent compte lors de la mise en œuvre. En espérant leur épargner quelques minutes d'effort.

6voto

KeyBrd Basher Points 639

Tout ce que vous avez à faire est de créer un validateur personnalisé et de l'ajouter à la collection de validateurs de votre page, chaque fois que la condition pour le faire se présente.

CustomValidator cv = new CustomValidator();

if(condition)
{
cv.IsValid = false;
cv.ErrorMessage = "This Catalog Data already exists.";
cv.ValidationGroup = "InputList";
this.Page.Validators.Add(cv);
}

NOTA : N'oubliez pas de spécifier le ValidationGroup ou le message d'erreur ne s'affichera pas malgré l'ajout du validateur personnalisé à votre page. Et oui, si vous obtenez une réponse à votre deuxième question( boîte de texte de surlignage ) affichez-la !

3voto

Canavar Points 29161

Pour ajouter un message d'erreur sur le résumé de validation, vous pouvez utiliser EnableClientScript de ValidationSummary et des autres contrôles de validation. Mettez EnableClientScript à false pour tous ces contrôles :

<asp:ValidationSummary
HeaderText="You must enter a value in the following fields :"
DisplayMode="BulletList"
EnableClientScript="false"
runat="server"/>

Pour la mise en évidence d'un contrôle, non, ce n'est pas possible avec les contrôles actuels.

Mais j'ai placé mes contrôles de validation près des contrôles liés, et j'ai défini leur Texte comme "*". Ensuite, si la validation échoue, elle apparaît près du contrôle échoué.

Vous pouvez peut-être utiliser un validateur personnalisé pour mettre en évidence le contrôle qui a échoué. Mais vous devriez écrire votre propre implémentation.

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