我怎么能忽略一个RegularEx pression情况? [英] How can I ignore case in a RegularExpression?

查看:162
本文介绍了我怎么能忽略一个RegularEx pression情况?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个asp.net MVC应用程序。有,它有一个被称为名称属性称为文件的实体。

I have an asp.net MVC application. There is an entity called File that it has a property called 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; }
   ...
}

有是用于检查的文件扩展名RegularEx pressionValidator。
是否有一个快速的方法,我可以告诉它忽略扩展的情况下,而无需显式添加大写变种,以我的验证前pression?
我需要为服务器端和客户端这RegularEx pressionValidator。
(我)可用于服务器端,但是这不工作的客户端

There is a RegularExpressionValidator that checks file extensions. Is there a quick way I can tell it to ignore the case of the extension without having to explicitly add the upper case variants to my validation expression? I need this RegularExpressionValidator for both Server-side and client-side. "(?i)" can be used for Server-side, but this doesn't work client-side

推荐答案

我能想到的一个方法是编写自定义验证属​​性:

One way I can think of is writing a custom validation attribute:

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

,然后用它装点你的模型:

and then decorate your model with it:

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

最后写在客户端上的适配器:

Finally write an adapter on the client:

<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文件,这样你就不必到处重复了。

Of course you could externalize the client rules into a separate javascript file so that you don't have to repeat it everywhere.

这篇关于我怎么能忽略一个RegularEx pression情况?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆