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.
¡Muchas gracias! –
¡Has hecho mi día! ¡Gracias! – Pal