asp.net – 数据注释 – 使用属性扩展并在资源文件中存储正则表达式
发布时间:2020-09-05 03:12:45 所属栏目:asp.Net 来源:互联网
导读:我目前正在使用MVC4数据注释来处理验证.我正在开发一个非常国际化的网站,因此我将所有文本保存在资源文件中. 我还想在资源文件中保留正则表达式以进行验证,这样我就可以使用相同的代码来检查,例如,Post Codes(UK)和Zip Codes(US),只需使用不同的RegEx(以及不
我目前正在使用MVC4数据注释来处理验证.我正在开发一个非常国际化的网站,因此我将所有文本保存在资源文件中. 我还想在资源文件中保留正则表达式以进行验证,这样我就可以使用相同的代码来检查,例如,Post Codes(UK)和Zip Codes(US),只需使用不同的RegEx(以及不同名称的资源等) ). 我有以下属性已经从资源文件中提取错误消息.我怎样才能从资源文件中获取正则表达式? [RegularExpression(@"^[w]{1,2}[0-9]{1,2}[w]?s?[0-9]{1,2}[w]{1,2}$",ErrorMessageResourceType = typeof(Resources.ValidationMessages),ErrorMessageResourceName = "validPostcode")] 编辑(再次) 我现在在哪里 按照下面的答案和一些额外的搜索,我有以下内容: 在Global.asax.cs中,我添加了以下行以确保调用客户端验证 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(LocalisedAttribute),typeof(RegularExpressionAttributeAdapter)); 在我的模型中,我调用了属性扩展 [Localised(typeof(Resources.FormValidation),"postcodeRegEx","postcodeMsg")] 最后,本地化正则表达式验证的属性扩展 public class LocalisedAttribute : RegularExpressionAttribute { public LocalisedAttribute(Type resource,string regularExpression,string errorMessage) : base(GetRegex(regularExpression)) { ErrorMessageResourceType = resource; ErrorMessageResourceName = errorMessage; } private static string GetRegex(string value) { return Resources.FormValidation.ResourceManager.GetString(value); } } 这是有效的,但只是我第一次在启动应用程序时使用它. 我将打开另一个问题来解决这个问题 – 它与原始请求没有直接关系,似乎与大多数人的实现没有关系,似乎并不特定于数据注释. 解决方法我已经有一些扩展的RegularExpressionAttribute实现,允许使用资源进行正则表达式模式.看起来像:public class RegularExpressionExAttribute : RegularExpressionAttribute,IClientValidatable { private Regex regex { get; set; } private string pattern; private string resourceName; private Type resourceType; /// <summary> /// constructor,calls base with ".*" basic regex /// </summary> /// <param name="resName">resource key</param> /// <param name="resType">resource type</param> public RegularExpressionExAttribute(string resName,Type resType) : base(".*") { resourceName = resName; resourceType = resType; } /// <summary> /// override RegularExpressionAttribute property /// </summary> public new string Pattern { get { SetupRegex(); return pattern; } } /// <summary> /// loads regex from resources /// </summary> private void SetupRegex() { ResourceAccessor ra = new ResourceAccessor(resourceName,resourceType); pattern = ra.resourceValue; regex = new Regex(pattern); } /// <summary> /// override validation with our regex /// </summary> /// <param name="value">string for validation</param> /// <returns></returns> public override bool IsValid(object value) { SetupRegex(); string val = Convert.ToString(value); if (string.IsNullOrEmpty(val)) return true; var m = regex.Match(val); return (m.Success && (m.Index == 0)); } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metaData,ControllerContext controllerContext) { yield return new ModelClientValidationRegexRule(base.ErrorMessageString,this.Pattern); } } 此外,它还使用ResourceAccessor类从资源中获取正则表达式 public class ResourceAccessor { private string resourceName; private Type resourceType; private Func<string> accessor; private string _resourceValue; public ResourceAccessor(string resourceName,Type resourceType) { this.resourceName = resourceName; this.resourceType = resourceType; } public string resourceValue { get { SetupAccessor(); return accessor(); } } private void SetupAccessor() { if (accessor != null) //already set return; string localValue = _resourceValue; bool flag1 = !string.IsNullOrEmpty(resourceName); bool flag2 = !string.IsNullOrEmpty(localValue); bool flag3 = resourceType != (Type)null; if (flag1 == flag2) { throw new InvalidOperationException("Can't set resource value"); } if (flag3 != flag1) { throw new InvalidOperationException("Resource name and type required"); } if (flag1) PropertyLookup(); else { accessor = (Func<string>)(() => localValue); } } private void PropertyLookup() { if (resourceType == (Type)null || string.IsNullOrEmpty(resourceName)) { throw new InvalidOperationException("Resource name and type required"); } PropertyInfo property = resourceType.GetProperty(resourceName,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (property != (PropertyInfo)null) { MethodInfo getMethod = property.GetGetMethod(true); if (getMethod == (MethodInfo)null || !getMethod.IsAssembly && !getMethod.IsPublic) property = (PropertyInfo)null; } if (property == (PropertyInfo)null) { throw new InvalidOperationException("Resource type doesn't have property"); } else if (property.PropertyType != typeof(string)) { throw new InvalidOperationException("Resource type must be string"); } else { accessor = (Func<string>)(() => (string)property.GetValue((object)null,(object[])null)); } } } 以下是使用示例: public class SignUpInput { [RegularExpressionEx("EmailValidationRegex",typeof(LocalizedResources),ErrorMessageResourceType = typeof(Messages),ErrorMessageResourceName = "invalidEmail")] public string Email { get; set; } } (编辑:4S站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 为ASP.NET应用程序实现后台服务的最佳方法是什么?
- asp.net – 测试Oracle存储过程的最简单的方法
- asp.net+ajaxfileupload.js 实现文件异步上传代码分享
- ASP.NET批量下载文件的方法
- IIS ASP.NET WebApi在请求同一台服务器时死锁
- asp.net-mvc – MVC“添加控制器”是“无法检索元数据…配置
- .net – CS0012:类型’System.Data.Linq.DataContext’在未
- ASP.NET:隐藏gridview中的列
- asp.net – 是否有可能过滤SignalR中的接收器?
- asp.net-mvc-3 – MVC 3 $.ajax – 响应似乎是从部分视图缓
推荐文章
站长推荐
- Asp.net core WebApi 使用Swagger生成帮助页实例
- asp.net-mvc-3 – 在MVC3中使用Html.LabelFor的表
- asp.net – coldfusion和.net上的单点登录
- asp.net webservice返回json的方法
- ASP.NET Web应用程序的安装
- asp.net-mvc – 如何从剃刀视图访问My.Resources
- 实体框架 – 等同于.HasOptional在实体框架核心1
- asp.net core webapi 服务端配置跨域的实例
- asp.net下使用jquery 的ajax+WebService+json 实
- asp.net – 从启用AJAX的WCF服务返回错误详细信息
热点阅读