How to change 'data-val-number' message validation in MVC while it is generated by @Html helper

后端 未结 14 1548
面向向阳花
面向向阳花 2020-11-28 03:44

Assume this model:

Public Class Detail
    ...
    
    
         


        
相关标签:
14条回答
  • 2020-11-28 04:20

    What you have to do is:

    Add the following code inside Application_Start() in Global.asax:

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

    Right click your ASP.NET MVC project in VS. Select Add => Add ASP.NET Folder => App_GlobalResources.

    Add a .resx file called Messages.resx in that folder.

    Add these string resources in the .resx file:

    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.
    

    Change the FieldMustBeNumeric value as you want... :)

    You're done.


    Check this post for more details:

    Localizing Default Error Messages in ASP.NET MVC and WebForms

    0 讨论(0)
  • 2020-11-28 04:20

    You can set ResourceKey of ClientDataTypeModelValidatorProvider class to name of a global resource that contains FieldMustBeNumeric key to replace mvc validation error message of number with your custom message. Also key of date validation error message is FieldMustBeDate.

    ClientDataTypeModelValidatorProvider.ResourceKey="MyResources"; // MyResource is my global resource
    
    0 讨论(0)
  • 2020-11-28 04:21

    From this book on MVC 3 that I have. All you have to do is this:

    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()); 
    } 
    

    Notice how the ErrorMessage is yielded, you specify the current culture and the localized message is extracted from the ValidationMessages(here be culture specifics).resx resource file. If you don't need that, just replace it with your own message.

    0 讨论(0)
  • 2020-11-28 04:24

    Here is another solution in pure js that works if you want to specify messages globally not custom messages for each item.

    The key is that validation messages are set using jquery.validation.unobtrusive.js using the data-val-xxx attribute on each element, so all you have to do is to replace those messages before the library uses them, it is a bit dirty but I just wanted to get the work done and fast, so here it goes for number type validation:

        $('[data-val-number]').each(function () {
        var el = $(this);
        var orig = el.data('val-number');
    
        var fieldName = orig.replace('The field ', '');
        fieldName = fieldName.replace(' must be a number.', '');
    
        el.attr('data-val-number', fieldName + ' باید عددی باشد')
    });
    

    the good thing is that it does not require compiling and you can extend it easily later, not robust though, but fast.

    0 讨论(0)
  • 2020-11-28 04:25

    a simple method is, use dataanotation change message on ViewModel:

    [Required(ErrorMessage ="الزامی")]
    [StringLength(maximumLength:50,MinimumLength =2)]
    [Display(Name = "نام")]
    public string FirstName { get; set; }
    
    0 讨论(0)
  • 2020-11-28 04:27

    As an alternate way around this, I applied a RegularExpression attribute to catch the invalid entry and set my message there:

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

    This slightly a hack but this seemed preferable to the complexity the other solutions presented, at least in my particular situation.

    EDIT: This worked well in MVC3 but it seems that there may well be better solutions for MVC4+.

    0 讨论(0)
提交回复
热议问题