.net 替换metadataattribute中的regularexpression字符串
我正在编写一个应用程序,从数据库加载语言文本以实现国际化,使用viewmodels中的键查找正确的文本。我已从修改了MyLocalizationprovider的一个版本,修改后的代码可在此处找到:。代码遍历元数据属性并替换标题显示名、占位符提示、errormessage errormessage和validation errormessage errormessage。我正在获取ErrorMessage的DisplayAttribute、Prompt和Name以及ErrorMessage的ValidationAttribute,以便在两个字段之间进行验证,在本例中为密码。我得到的钥匙是这样的:.net 替换metadataattribute中的regularexpression字符串,.net,razor,model-view-controller,.net,Razor,Model View Controller,我正在编写一个应用程序,从数据库加载语言文本以实现国际化,使用viewmodels中的键查找正确的文本。我已从修改了MyLocalizationprovider的一个版本,修改后的代码可在此处找到:。代码遍历元数据属性并替换标题显示名、占位符提示、errormessage errormessage和validation errormessage errormessage。我正在获取ErrorMessage的DisplayAttribute、Prompt和Name以及ErrorMessage的Va
if (typeName.Equals("DisplayAttribute"))
{
nameKey = ((DisplayAttribute) attr).Name;
placeholderKey = ((DisplayAttribute) attr).Prompt;
...
然后用数据库中的值替换键。我的viewmodels如下所示:
[Required(ErrorMessage = "changepassword_newpassword_error")]
[DataType(DataType.Password)]
[Display(Prompt = "changepassword_newpassword_placeholder", Name = "changepassword_newpassword_headline")]
[RegularExpression(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,12}", ErrorMessage = "changepassword_newpassword_regexerror")]
public string NewPassword { get; set; }
这适用于占位符、标题、字段的错误消息和验证,但是我还不知道如何找到RegularExpression。我以为它会像它的ErrorMessage一样存在于ValidationAttribute中,但我在那里找不到任何东西。看
哪里可以找到regularexpression字符串的字段,它是否存在?
或者我应该试着写我自己的属性,比如,如果是的话,有人能帮我吗 经过进一步的搜索,我找到了更多的答案,从而找到了一个可行的解决方案 首先,我没有监听ValidationAttribute,这是一个很大的attributeclass,而是沿着链条往下搜索RequiredAttribute和CompareAttribute,以及DisplayAttribute。通过这些,我可以找到输入字段的比较错误、必填错误以及标题和占位符 我发现存在一个RegularExpressionAttribute,在那里我可以找到字段模式,尽管我只能获取值,不能设置值。解决方案是实现一个自定义RegularExpressionAttribute类,该类继承自ValidationAttribute,非常类似于。使用它虽然不起作用,但因为它没有返回任何validationerrors。解决方案是从IclientValidate继承。请参阅下面的完整代码
public class CustomRegularExpressionValidateAttribute : ValidationAttribute, IClientValidatable
{
public string Pattern { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var password = (string)value;
var match = Regex.Match(password, Pattern);
if (!match.Success)
{
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return null;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRegexRule(FormatErrorMessage(metadata.GetDisplayName()), Pattern);
}
}
现在整个链条都能工作了。我希望这可能对某人有所帮助
[CustomRegularExpressionValidate(Pattern = "PasswordRegex", ErrorMessage = "changepassword_newpassword_regexerror")]