2011-05-09 7 views
10

Tengo una aplicación asp.net MVC. Hay una entidad llamada File que tiene una propiedad llamada Name.¿Cómo puedo ignorar el caso en una expresión regular?

using System.ComponentModel.DataAnnotations; 

public class File { 
    ... 
    [RegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx ..., ErrorMessage = "Invali File Name"] 
    public string Name{ get; set; } 
    ... 
} 

Hay un RegularExpressionValidator que comprueba las extensiones de archivos. ¿Existe alguna forma rápida de que ignore el caso de la extensión sin tener que agregar explícitamente las variantes en mayúscula a mi expresión de validación? Necesito este RegularExpressionValidator tanto para el lado del servidor como para el lado del cliente. "(? I)" se puede utilizar para el lado del servidor, pero esto no funciona en el lado del cliente

Respuesta

8

Una forma que se me ocurre es escribir un atributo de validación personalizada:

public class IgnorecaseRegularExpressionAttribute : RegularExpressionAttribute, IClientValidatable 
{ 
    public IgnorecaseRegularExpressionAttribute(string pattern): base("(?i)" + pattern) 
    { } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ValidationType = "icregex", 
      ErrorMessage = ErrorMessage 
     }; 
     // Remove the (?i) that we added in the pattern as this 
     // is not necessary for the client validation 
     rule.ValidationParameters.Add("pattern", Pattern.Substring(4)); 
     yield return rule; 
    } 
} 

y luego decorar su modelo con ella:

[IgnorecaseRegularExpression(@"([^.]+[.](jpg|jpeg|gif|png|wpf|doc|docx|xls|xlsx", ErrorMessage = "Invalid File Name"] 
public string Name { get; set; } 

Finalmente escribir un adaptador en el cliente:

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    jQuery.validator.unobtrusive.adapters.add('icregex', [ 'pattern' ], function (options) { 
     options.rules['icregex'] = options.params; 
     options.messages['icregex'] = options.message; 
    }); 

    jQuery.validator.addMethod('icregex', function (value, element, params) { 
     var match; 
     if (this.optional(element)) { 
      return true; 
     } 

     match = new RegExp(params.pattern, 'i').exec(value); 
     return (match && (match.index === 0) && (match[0].length === value.length)); 
    }, ''); 
</script> 

@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
    <input type="submit" value="OK" /> 
} 

Por supuesto, podría externalizar las reglas del cliente en un archivo javascript por separado para que pueda no tiene que repetirlo en todas partes.

+0

¡Muchas gracias! –

+0

¡Has hecho mi día! ¡Gracias! – Pal

0

Umh podría mostrar la validación del cliente?

umh Creo que puede crear su propio atributo que se deriva de RegularExpression y agregar el functionallity para ignorar el caso.

Cuestiones relacionadas