asp.net-mvc-3 – 在自定义显示名称属性中检索模型名称
这是我的发展要求,
我的标签值存储在数据库中,我仍然希望以声明的方式使用数据注释,这是为了使我的模型更具可读性. 这是我的方法, 我决定编写自定义DisplayNameAttribute,其中我的模型提供的默认值将被从数据库中检索的值覆盖. 这是模型中定义的属性, [CustomDisplay(Name: "First Name")] [CustomRequired(ErrorMessage: "{0} is required")] public String FirstName { get; set; } 这是自定义显示名称属性类, public class CustomDisplayAttribute : DisplayNameAttribute { private string _defaultName; private string _displayName; public CustomDisplayAttribute(string Name) { _defaultName = Name; } public override string DisplayName { get { if (String.IsNullOrEmpty(_displayName)) { _displayName = DAO.RetrieveValue(**ModelName**,_defaultName); } return _displayName; } } } 现在,您可以在上面的代码中看到,ModelName是我需要的东西,但我没有! 在调试时,我深入了解ModelMetadataProviders.Current,可以看到当前模型的可用性.但是,由于它是非公共静态成员的一部分,我无法通过我的代码访问它. 我写了下面的方法来通过反射检索模型名称, private static string GetModelName() { var modelName = String.Empty; FieldInfo info = typeof(CachedAssociatedMetadataProvider<CachedDataAnnotationsModelMetadata>) .GetField("_typeIds",BindingFlags.NonPublic | BindingFlags.Static); var types = (ConcurrentDictionary<Type,string>)info.GetValue(null); modelName = types.FirstOrDefault().Key.Name; return modelName; } 但问题是,类型集合为我提供了所有模型的条目(用户至少访问过一次).并且没有任何线索可以知道,目前正在行动! 解决方法
IMHO属性不应用于进行数据库调用.属性应该用于向类/属性等添加元数据……
因此,如果您愿意将代码更改为更像MVC的Microsoft体系结构,那么您将拥有自定义属性和自定义ModelMetadataProvider: public class CustomDisplayAttribute : Attribute { public CustomDisplayAttribute(string name) { Name = name; } public string Name { get; private set; } } 然后是一个新的ModelMetadataProvider: public class DatabaseModelMetadataProvider : DataAnnotationsModelMetadataProvider { public DatabaseModelMetadataProvider() { } protected override ModelMetadata CreateMetadata( IEnumerable<Attribute> attributes,Type containerType,Func<object> modelAccessor,Type modelType,string propertyName) { var metadata = base.CreateMetadata(attributes,containerType,modelAccessor,modelType,propertyName); var displayAttribute = containerType == null ? null as CustomDisplayAttribute : containerType.GetProperty(propertyName) .GetCustomAttributes(false) .OfType<CustomDisplayAttribute>() .FirstOrDefault(); if (displayAttribute != null) { var displayValue = DAO.RetrieveValue(containerType.ToString(),displayAttribute.Name) metadata.DisplayName = displayValue; } return metadata; } } 哪里 public class MyViewModel { public MyPropertyType PropertyName { get; set; } } > containerType = MyViewModel 然后注册提供者(global.asax或其他): ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(); 另外你可以看一下ModelMetadata它还有一些你可能想要在未来改变的东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 编码为utf 8的MVC 3 Razor页面显示了编码
- asp.net – 为什么设置为SqlServer时会话超时不起作用?
- 重定向后ASP.NET会话丢失,但仅限于IE
- asp.net – 检查Active Directory密码是否与cookie不同
- asp.net-mvc – 带有淘汰赛的EditorFor HTML Helper
- asp.net-mvc – ASP.NET MVC 4 – 用户组的唯一路由?
- asp.net-mvc – 当参数名称需要不同时,如何重用远程验证方法
- asp.net – IIS7.5中x64进程的内存限制
- asp.net-web-api – 如何使用ASP.NET标识设置Thinktecture
- 如何将ASP.Net Webforms网站与ASP.Net MVC Web应用程序集成
- asp.net-mvc – 剃刀替换的优点(@href)
- asp.net – 估算Web应用程序峰值带宽需求的最准确
- asp.net – 获取当前用户的GUID?
- ASP.NET MVC“Donut caching”和TempData
- asp.net-mvc – ASP.NET MVC 3 – 你想看什么功能
- asp.net web大文件上传带进度条实例代码
- asp.net – 使用ASP .Net MVC4处理Web API中的集
- ASP.Net Response.Redirect不能在Application_Er
- asp.net – 如何从我的网站项目中删除未使用的CS
- asp.net-mvc – 如何在asp.net mvc中提交下拉列表