Как я могу игнорировать регистр в регулярном выражении? - PullRequest
10 голосов
/ 09 мая 2011

У меня есть приложение asp.net MVC. Существует сущность с именем File, у которой есть свойство с именем Name.

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; }
   ...
}

Существует RegularExpressionValidator, который проверяет расширения файлов. Есть ли быстрый способ, которым я могу сказать, чтобы он игнорировал регистр расширения без необходимости явно добавлять варианты в верхнем регистре в мое проверочное выражение? Мне нужен этот RegularExpressionValidator как для стороны сервера, так и для стороны клиента. «(? i)» может использоваться для серверной стороны, но это не работает на клиентской стороне

Ответы [ 2 ]

9 голосов
/ 09 мая 2011

Один из способов, который я могу придумать, - написать собственный атрибут проверки:

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

, а затем украсьте им свою модель:

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

Наконец, напишите адаптер на клиенте:

<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" />
}

Конечно, вы могли бы перенести правила клиента в отдельный файл javascript, чтобы вам не приходилось повторять его везде.

0 голосов
/ 09 мая 2011

Хм, не могли бы вы показать подтверждение клиента?

хм, я думаю, что вы можете создать свой собственный атрибут, производный от RegularExpression, и добавить функцию allity, чтобы игнорировать регистр.

...