79 votes

Comment modifier les données-val-numéro de message de validation dans MVC alors qu'il est généré par @helper Html

Assumer ce modèle:

Public Class Detail
    ...
    <DisplayName("Custom DisplayName")>
    <Required(ErrorMessage:="Custom ErrorMessage")>
    Public Property PercentChange As Integer
    ...
end class

et la vue:

@Html.TextBoxFor(Function(m) m.PercentChange)

procédera de ce code html:

   <input data-val="true" 
    data-val-number="The field 'Custom DisplayName' must be a number." 
    data-val-required="Custom ErrorMessage"     
    id="PercentChange" 
    name="PercentChange" type="text" value="0" />

Je veux personnaliser l' data-val-number message d'erreur qui, j'imagine, a généré en raison PercentChange est Integer. Je cherchais un tel attribut à modifier, range ou que ce soit lié ne fonctionne pas.
Je sais qu'il y est une chance dans l'édition discrète js fichier lui-même ou de la remplacer dans le côté client. Je veux changer de data-val-numbers'message d'erreur comme les autres à côté serveur.

80voto

HenningJ Points 560

Vous pouvez remplacer le message en fournissant les données-val-numéro de l'attribut de vous-même lors de l'affichage du champ. Il remplace le message par défaut. Cela fonctionne au moins avec MVC 4.

@Html.EditorFor(modèle => modèle.MyNumberField, nouveau { data_val_number="Approvisionnement un entier, mec!" })

N'oubliez pas que vous devez utiliser le trait de soulignement dans le nom de l'attribut pour Rasoir d'accepter votre attribut.

53voto

Leniel Macaferi Points 38324

Ce que vous avez à faire est de:

Ajoutez le code suivant à l'intérieur d' Application_Start() en Global.asax:

 ClientDataTypeModelValidatorProvider.ResourceClassKey = "Messages";
 DefaultModelBinder.ResourceClassKey = "Messages";

Cliquez droit sur l'ASP.NET projet MVC dans VS. Sélectionnez Add => Add ASP.NET Folder => App_GlobalResources.

Ajouter un .resx fichier appelé Messages.resx dans ce dossier.

Ajouter ces ressources de chaîne dans l' .resx le fichier:

FieldMustBeDate        The field {0} must be a date.
FieldMustBeNumeric     The field {0} must be a number.
PropertyValueInvalid   The value '{0}' is not valid for {1}.
PropertyValueRequired  A value is required.

Modifier l' FieldMustBeNumeric de la valeur que vous voulez... :)

Vous avez terminé.


Vérifiez ce post pour plus de détails:

La localisation par Défaut des Messages d'Erreur dans ASP.NET WebForms et MVC

40voto

Darin Dimitrov Points 528142

Ce n'est pas va être facile. Le message par défaut est stockée en tant que ressource incorporée dans l' System.Web.Mvc de l'assemblée et de la méthode fetch est une private static méthode interne scellé intérieur de la classe (System.Web.Mvc.ClientDataTypeModelValidatorProvider+NumericModelValidator.MakeErrorString). C'est comme si le gars à Microsoft de codage de ce cachait un secret top :-)

Vous pouvez prendre un coup d'oeil à la suite de blog qui décrit une solution possible. En gros, vous avez besoin de remplacer l'existant ClientDataTypeModelValidatorProvider avec un programme personnalisé.

Si vous n'aimez pas le hardcore de codage que vous devez faire, vous pouvez aussi remplacer cette valeur entière à l'intérieur de votre modèle de vue avec une chaîne et d'avoir une validation personnalisée attribut qui permettrait de faire l'analyse et de fournir un message d'erreur personnalisé (qui pourrait même être localisée).

23voto

Matthew Nichols Points 1327

Comme une autre façon de contourner cela, j'ai appliqué une RegularExpression attribut pour attraper l'entrée non valide et mis mon message là:

[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]

Ce peu un hack mais cela semblait préférable à la complexité les autres solutions présentées, au moins dans mon cas en particulier.

EDIT: Cela a bien fonctionné dans MVC3, mais il semble qu'il y a peut-être mieux de solutions pour MVC4+.

10voto

Denis Valeev Points 4354

À partir de ce livre sur MVC 3 que j'ai. Tout ce que vous avez à faire est ceci:

public class ClientNumberValidatorProvider : ClientDataTypeModelValidatorProvider 
{ 
   public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, 
                                                          ControllerContext context) 
   { 
       bool isNumericField = base.GetValidators(metadata, context).Any(); 
       if (isNumericField) 
           yield return new ClientSideNumberValidator(metadata, context); 
   } 
} 

public class ClientSideNumberValidator : ModelValidator 
{ 
  public ClientSideNumberValidator(ModelMetadata metadata,  
      ControllerContext controllerContext) : base(metadata, controllerContext) { } 

  public override IEnumerable<ModelValidationResult> Validate(object container) 
  { 
     yield break; // Do nothing for server-side validation 
  } 

  public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
  { 
     yield return new ModelClientValidationRule { 
        ValidationType = "number", 
        ErrorMessage = string.Format(CultureInfo.CurrentCulture,  
                                     ValidationMessages.MustBeNumber,  
                                     Metadata.GetDisplayName()) 
        }; 
  } 
} 

protected void Application_Start() 
{ 
    // Leave the rest of this method unchanged 

    var existingProvider = ModelValidatorProviders.Providers 
        .Single(x => x is ClientDataTypeModelValidatorProvider); 
    ModelValidatorProviders.Providers.Remove(existingProvider); 
    ModelValidatorProviders.Providers.Add(new ClientNumberValidatorProvider()); 
} 

Remarquez comment le ErrorMessage est donné, vous spécifiez la culture actuelle et le message localisée est extraite de la ValidationMessages(ici de la culture de détails).resx fichier de ressources. Si vous n'en avez pas besoin, il suffit de remplacer avec votre propre message.

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