我需要在模型中动态设置RegularExpression。
我的意思是,我已经将RegularExpression存储在表中,然后我将该值存储在一个变量中。
现在,我想在常规Express验证中提供该变量。
i.e
[RegularExpression(VariableValue, ErrorMessage = "Valid Phone is required")]就像这样
i.e
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; }发布于 2014-03-05 22:29:41
您有两个选择,要么创建自己的验证属性,要么使整个模型“可验证”。
选项1
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));
}
}
}然后在你的模型上:
[RegexFromDbValidator]
public string Telephone {get; set;}选项2
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的示例
发布于 2014-03-05 21:30:48
正如Murali所述,数据注释属性值必须是编译时常量。
如果你想执行基于其他模型值的动态验证,你可以尝试使用某种第三方框架(例如,Fluent Validation,甚至can be integrated in ASP.NET's model validation )。
发布于 2014-03-05 21:41:37
我相信有一种方法可以通过继承IValidatableObject接口来实现它。这样做之后,只要在服务器端验证了ModelState,您就可以执行所需的所有检查。它看起来像这样:
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'));
}
}https://stackoverflow.com/questions/22198404
复制相似问题