首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在模型中动态设置RegularExpression

在模型中动态设置RegularExpression
EN

Stack Overflow用户
提问于 2014-03-05 20:54:56
回答 3查看 3.8K关注 0票数 2

我需要在模型中动态设置RegularExpression。

我的意思是,我已经将RegularExpression存储在表中,然后我将该值存储在一个变量中。

现在,我想在常规Express验证中提供该变量。

i.e

代码语言:javascript
运行
复制
[RegularExpression(VariableValue, ErrorMessage = "Valid Phone is required")]

就像这样

i.e

代码语言:javascript
运行
复制
string CustomExpress = "@"^(\+|\d)(?:\+?1[-. ]?)?\(?([0-9]{2})\)?[-. ]?([0-9]{1})[-. ]?([0-9]{9})$" (from Database's table)

[RegularExpression(CustomExpress, ErrorMessage = "Valid Phone is required")]
public string Phone { get; set; }
EN

回答 3

Stack Overflow用户

发布于 2014-03-05 22:29:41

您有两个选择,要么创建自己的验证属性,要么使整个模型“可验证”。

选项1

代码语言:javascript
运行
复制
public class RegexFromDbValidatorAttribute : ValidationAttribute
{
    private readonly IRepository _db;

    //parameterless ctor that initializes _db

    public override ValidationResult IsValid(object value, ValidationContext context)
    {
        string regexFromDb = _db.GetRegex();

        Regex r = new Regex(regexFromDb);

        if (value is string && r.IsMatch(value as string)){
            return ValidationResult.Success;
        }else{
            return new ValidationResult(FormatMessage(context.DisplayName));
        }
    }
}

然后在你的模型上:

代码语言:javascript
运行
复制
[RegexFromDbValidator]
public string Telephone {get; set;}

选项2

代码语言:javascript
运行
复制
public SomeModel : IValidatableObject
{
    private readonly IRepository _db;

    //don't forget to initialize _db in ctor

    public string Telephone {get; set;}

    public IEnumerable<ValidationResult> Validate(ValidationContext context)
    {

        string regexFromDb = _db.GetRegex();

        Regex r = new Regex(regexFromDb);

        if (!r.IsMatch(Telephone))
            yield return new ValidationResult("Invalid telephone number", new []{"Telephone"});
    }
}

是一个很好的资源,它解释了如何创建验证属性

使用IValidatableObject的示例

票数 3
EN

Stack Overflow用户

发布于 2014-03-05 21:30:48

正如Murali所述,数据注释属性值必须是编译时常量。

如果你想执行基于其他模型值的动态验证,你可以尝试使用某种第三方框架(例如,Fluent Validation,甚至can be integrated in ASP.NET's model validation )。

票数 0
EN

Stack Overflow用户

发布于 2014-03-05 21:41:37

我相信有一种方法可以通过继承IValidatableObject接口来实现它。这样做之后,只要在服务器端验证了ModelState,您就可以执行所需的所有检查。它看起来像这样:

代码语言:javascript
运行
复制
public class SomeClass: IValidatableObject {
    private RegEx validation;
    public SomeClass(RegEx val) {
        this.validation = val;
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        // perform validation logic - check regex etc...
        // if an error occurs:
        results.Add(new ValidationResult('error message'));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22198404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档