替换metadataattribute中的regularexpression-string

时间:2014-11-14 14:56:48

标签: .net razor model-view-controller

我正在编写一个应用程序,它从数据库加载语言文本以启用国际化,使用视图模型中的键来查找正确的文本。我已经从http://www.codeproject.com/Tips/514321/A-Simple-and-Effective-Way-to-Localize-ASP-Net-MVC修改了MyLocalizationprovider的版本,我的修改后的代码可以在这里找到:https://gist.github.com/TheConfuser/5f4a64ebe13254e7d45b。代码通过元数据属性并替换标题(DisplayName),占位符(Prompt),errormessage(ErrorMessage)和验证错误消息(ErrorMessage)。我正在获取ErrorMessage的DisplayAttribute,Prompt和Name以及ErrorMessage的ValidationAttribute,以便在两个字段之间进行验证,在这种情况下是密码。我得到这样的钥匙:

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。我认为它将存在于ValidationAttribute中,因为它的ErrorMessage确实存在,但我找不到任何东西。见http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute(v=vs.110).aspx

我在哪里可以找到regularexpression-string的字段,它是否存在? 或者我应该尝试编写自己的属性(如Set RegularExpression Dynamically in Model),如果有的话可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

经过一些进一步的搜索后,我找到了更多的答案,引导我找到一个有效的解决方案。

首先,除了监听ValidationAttribute(一个大的属性类)之外,我沿着链接下去,除了DisplayAttribute之外还寻找RequiredAttribute和CompareAttribute。有了这些,我可以找到比较错误,requirederrors以及输入字段的标题和占位符。

我发现存在一个RegularExpressionAttribute我可以找到字段Pattern,虽然我只能获取值,而不是设置值。解决方案是实现一个自定义的RegularExpressionAttribute类,它继承自ValidationAttribute,就像RegularExpressionAttribute一样。使用它虽然不起作用,但因为它没有给出任何验证错误。解决方案也是从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);
    }

}

我的类MyLocalizationProvider读取属性DisplayAttribute,CompareAttribute,RequiredAttribute和CustomRegularExpressionValidateAttribute,并返回视图模型中指定键的值。 viewmodel中的一行对于类来说是这样的:

[CustomRegularExpressionValidate(Pattern = "PasswordRegex", ErrorMessage = "changepassword_newpassword_regexerror")]

现在整条链都有效。我希望这可能对某人有所帮助。