Question

Dans le monde de MVC, j'ai ce modèle de vue ...

public class MyViewModel{

[Required]
public string FirstName{ get; set; }    }

... et ce genre de chose à mon avis ...

<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>

Ma question: si je soumets ce formulaire sans fournir de nom, le message suivant "Le champ Prénom est obligatoire"

OK Alors, je vais changer ma propriété pour ...

[DisplayName("First Name")]
[Required]
public string FirstName{ get; set; }    

.. et obtenez à présent "Le champ Prénom est obligatoire"

Tout va bien jusqu'à présent.

Alors maintenant, je veux que le message d'erreur affiche "Prénom Blah Blah". Comment puis-je remplacer le message par défaut pour afficher DisplayName + " Blah Blah ", sans annoter toutes les propriétés avec quelque chose comme

[Required(ErrorMessage = "First Name Blah Blah")]

A bientôt,

ETFairfax

Était-ce utile?

La solution

public class GenericRequired: RequiredAttribute
{
    public GenericRequired()
    {
        this.ErrorMessage = "{0} Blah blah"; 
    }
}

Autres conseils

Voici un moyen de le faire sans sous-classe RequiredAttribute . Il suffit de créer des classes d’adaptateur d’attributs. Ici, j'utilise ErrorMessageResourceType / ErrorMessageResourceName (avec une ressource) mais vous pouvez facilement définir ErrorMessage , ou même vérifier l'existence de remplacements avant les paramétrer.

Global.asax.cs:

public class MvcApplication : HttpApplication {
    protected void Application_Start() {
        // other stuff here ...
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RequiredAttribute), typeof(CustomRequiredAttributeAdapter));
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(StringLengthAttribute), typeof(CustomStringLengthAttributeAdapter));
    }
}

private class CustomRequiredAttributeAdapter : RequiredAttributeAdapter {
    public CustomRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValRequired";
    }
}

private class CustomStringLengthAttributeAdapter : StringLengthAttributeAdapter {
    public CustomStringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValStringLength";
    }
}

Dans cet exemple, vous créez un fichier de ressources nommé Resources.resx avec ValRequired en tant que nouveau message requis par défaut et ValStringLength en tant que longueur de chaîne dépassant le message par défaut. Notez que pour les deux, {0} reçoit le nom du champ, que vous pouvez définir avec [Afficher (Nom = "quot. Nom du champ")] .

Il semble que RequiredAttribute n'implémente pas IClientValidatable. Par conséquent, si vous remplacez RequiredAttribute, il interrompt la validation côté client.

Donc, voici ce que j'ai fait et cela fonctionne. J'espère que cela aide quelqu'un.

public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
    public CustomRequiredAttribute()
    {
        this.ErrorMessage = "whatever your error message is";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "required"
        };
    }
}

Il suffit de changer

[Required] 

à

[Required(ErrorMessage = "Your Message, Bla bla bla aaa!")]

Edit: J'ai posté ceci parce que je cherchais cette solution avec l'attribut [Required] et que j'ai eu du mal à le trouver. Créer de nouvelles questions / réponses ne semble pas très bien, car cette question existe déjà.

J'essayais de résoudre la même chose et j'ai trouvé une solution très simple dans MVC 4.

Tout d'abord, vous devrez probablement stocker les messages d'erreur quelque part. J'ai utilisé des ressources personnalisées, bien décrites à l'adresse http://afana.me/post/aspnet-mvc. -internationalisation.aspx .

L'important est que je puisse obtenir n'importe quelle ressource (même un message d'erreur) en appelant simplement ResourcesProject.Resources.SomeCustomError ou ResourcesProject.Resources.MainPageTitle etc. Chaque fois que j'essaie pour accéder à la classe Resources, il faut des informations sur la culture du fil actuel et renvoie le bon langage.

J'ai un message d'erreur pour la validation de champ dans ResourcesProject.Resources.RequiredAttribute . Pour que ce message apparaisse dans la vue, il suffit de mettre à jour l'attribut [Obligatoire] avec ces deux paramètres.

ErrorMessageResourceType - Type qui sera appelé (dans notre exemple, ResourcesProject.Resources)

ErrorMessageResourceName - Propriété qui sera appelée sur le type ci-dessus (dans notre cas, RequiredAttribute)

Voici un modèle de connexion très simplifié, qui affiche uniquement le message de validation du nom d'utilisateur. Lorsque le champ est vide, il prend la chaîne de ResourcesProject.Resources.RequiredAttribute et l’affiche sous forme d’erreur.

    public class LoginModel
    {        
        [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName="RequiredAttribute")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

Vous pouvez écrire votre propre attribut:

public class MyRequiredAttribute : ValidationAttribute
{
    MyRequiredAttribute() : base(() => "{0} blah blah blah blaaaaaah")
    {

    }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }
        string str = value as string;
        if (str != null)
        {
            return (str.Trim().Length != 0);
        }
        return true;
    }
}

Ceci est une copie de RequiredAttribute from Reflector avec le message d'erreur modifié.

using Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Web;
using System.Web.Mvc;

public class CustomRequiredAttribute : RequiredAttribute,  IClientValidatable
{
    public CustomRequiredAttribute()
    {
        ErrorMessageResourceType = typeof(ValidationResource);
        ErrorMessageResourceName = "RequiredErrorMessage";
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {


        yield return new ModelClientValidationRule
        {
            ErrorMessage = GetRequiredMessage(metadata.DisplayName),
            ValidationType = "required"
        };
    }


    private string GetRequiredMessage(string displayName) {

        return displayName + " " + Resources.ValidationResource.RequiredErrorMessageClient;        

    }


}

App_GlobalResources / ValidationResource.resx

 entrer la description de l'image ici

Utilisez maintenant les annotations de données

[CustomRequired]

Cela a fonctionné pour moi. Lisez attentivement les commentaires à l'intérieur du code. (Basé sur la réponse de Chad).

 // Keep the name the same as the original, it helps trigger the original javascript 
 // function for client side validation.

        public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute, IClientValidatable
            {
                public RequiredAttribute()
                {
                    this.ErrorMessage = "Message" // doesnt get called again. only once.
                }

                public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
                {
                    yield return new ModelClientValidationRule
                    {
                        ErrorMessage = "Message", // this gets called on every request, so it's contents can be dynamic.
                        ValidationType = "required"
                    };
                }
            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top