我正在编写一个应用程序,它从数据库加载语言文本以启用国际化,使用视图模型中的键来查找正确的文本。我已经从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),如果有的话可以帮助我吗?
答案 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")]
现在整条链都有效。我希望这可能对某人有所帮助。