Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有RegularExpression属性的Asp.Net MVC 3.0模型本地化_C#_Asp.net Mvc 3_Localization_Data Annotations_Validationattribute - Fatal编程技术网

C# 带有RegularExpression属性的Asp.Net MVC 3.0模型本地化

C# 带有RegularExpression属性的Asp.Net MVC 3.0模型本地化,c#,asp.net-mvc-3,localization,data-annotations,validationattribute,C#,Asp.net Mvc 3,Localization,Data Annotations,Validationattribute,我在自定义DataAnnotationsModelMetadataProvider类中编写了自定义错误消息本地化逻辑。它可以很好地处理内置StringLengthAttribute或RequiredAttribute验证错误消息。但是我在自定义派生的RegularExpressionAttribute类中遇到了问题。我使用的逻辑如下: 公共类AccountNameFormatAttribute:RegularExpressionAttribute{ 公共accountnameformattrib

我在自定义DataAnnotationsModelMetadataProvider类中编写了自定义错误消息本地化逻辑。它可以很好地处理内置StringLengthAttribute或RequiredAttribute验证错误消息。但是我在自定义派生的RegularExpressionAttribute类中遇到了问题。我使用的逻辑如下:

公共类AccountNameFormatAttribute:RegularExpressionAttribute{ 公共accountnameformattribute :baseLinnet.Core.Shared.regexpartns.AccountNamePattern{ } 公共重写字符串FormatErrorMessagestring名称{ 返回字符串。格式{0}字段只能包含字母、数字或|.|-| |字符,名称; } } 公共类注册视图模型{ [帐户名称格式] [StringLength 16,最小长度=3] [必需] [显示名称帐户名称] 公共字符串AccountName{get;set;} [必需] [显示名称密码] [StringLength 32,最小长度=6] [DataTypeSystem.ComponentModel.DataAnnotations.DataType.Password] 公共字符串密码{get;set;} //…和其他属性,非常相似// } 公共类MvcDataAnnotationsModelValidatorProvider:DataAnnotationsModelValidatorProvider{ 受保护的覆盖IEnumerable GetValidatorsModelMetadata元数据、ControllerContext上下文、IEnumerable属性{ MyMvcController MyMvcController=context.Controller作为MyMvcController;/*自定义mvc控制器,包含wcf服务激活方法和公共属性*/ 如果myMvcController==null{ 返回base.GetValidatorsmetadata、上下文、属性; } List newAttributes=新列表; 属性中的foreach属性att{ 如果att.GetType!=typeofValidationAttribute&!att.GetType.IsSubclassOftypeofValidationAttribute{ //如果这不是验证属性,则不执行任何操作。 newAttributes.Addatt; 持续 } ValidationAttribute validationAtt=作为ValidationAttribute的附件; 如果!string.IsNullOrWhiteSpacevalidationAtt.ErrorMessageResourceName&&validationAtt.ErrorMessageResourceType!=null{ //如果已设置资源键和资源类型,则不执行任何操作。 newAttributes.AddvalidationAtt; 持续 } string translationKey=MvcModelMetaData.ValidationMessages.+metadata.ModelType.Name+metadata.PropertyName!=null?+metadata.PropertyName:string.Empty+.+validationAtt.GetType.Name; string originalText=validationAtt.FormatErrorMessage{0};/*未翻译的默认英文文本*/ //将当前属性克隆到新属性中 //不要破坏原始属性以供以后使用 //使用Activator.CreateInstance,然后在内部使用AutoMapper进行映射。。 var newAtt=this.clonevalidationattitributevalidationatt; //正在通过WCF服务从数据库获取翻译。。。 //此时,我可以看到错误字符串总是被转换的。 //它可以完美地与[Required]、[StringLength]和[DataType]属性配合使用。 //但不知何故,它无法与网页上的AccountNameFormatAttribute一起工作,即使我按预期提供了翻译文本。。 //即使其ErrorMessage已设置为翻译文本, //它仍然会在网页上显示覆盖的FormatErrorMessage方法中的原始英文文本。 //客户端验证和服务器端验证都是一样的。 //似乎它不关心我手动设置的错误消息。 newAtt.ErrorMessage=myMvcController.Translations.GetTranslationtranslationKey,originalText; newAttributes.AddnewAtt; } IEnumerable result=base.GetValidatorsmetadata,context,newAttributes; 返回结果; } 私有验证属性CloneValidationAttributeValidationAttributeValidationAttribute附件{ 如果att==null{ 返回null; } 类型attType=att.GetType; ConstructorInfo[]ConstructorInfo=attType.GetConstructors;
如果constructorinfo==null | | constructorinfo.Length ci.GetParameters.Length似乎我的逻辑实际上是一种奇怪的方法

我发现为每种类型的验证属性创建自定义DataAnnotationsModelValidator,然后翻译Validate和GetClientValidationRules方法中的错误消息

public class MvcRegularExpressionAttributeAdapter : RegularExpressionAttributeAdapter {
    public MvcRegularExpressionAttributeAdapter(ModelMetadata metadata, ControllerContext context, RegularExpressionAttribute attribute)
      : base(metadata, context, attribute) {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
      return MvcValidationResultsTranslation.TranslateClientValidationRules(base.GetClientValidationRules(), this.Metadata, this.ControllerContext, this.Attribute);
    }

    public override IEnumerable<ModelValidationResult> Validate(object container) {
      return MvcValidationResultsTranslation.TranslateValidationResults(base.Validate(container), this.Metadata, this.ControllerContext, this.Attribute);
    }
}

您可以使用我的Griffin.MvcContrib来简化本地化

使用nuget下载griffin.mvccontrib 如前所述定义字符串表。 直接在视图模型中使用正则[RegularExpression]属性。 将其添加到字符串表中:

SignUpViewModel_AccountName_RegularExpression "{0} field must contain only letters, numbers or | . | - | _ | characters.

就是这样。

我试过这个,但它对我不起作用。。。
SignUpViewModel_AccountName_RegularExpression "{0} field must contain only letters, numbers or | . | - | _ | characters.