asp.net-mvc-2 – ASP.NET MVC2 ModelMetadataProviders:重写Create
从MetadataProviders开始,我很想探索框架的扩展点.我目前已经成功实施了
populating ModelMetadata.IsRequired property using 通常,我见过的示例会覆盖CreateMetadata(). >使用这两种选择的利弊是什么? 作为额外的:是否有任何好的资源(博客,书籍)可以从这个扩展点学习? 解决方法GetMetadataForProperty()在类ModelMetadataProvider上声明.AssociatedMetadataProvider派生自ModelMetadataProvider. CreateMetadata()在AssociatedMetadataProvider上声明.在您提供的链接中重写的DataAnnotationsMetadataProvider派生自AssociatedMetadataProvider. MVC框架调用ModelMetadataProvider的GetMetadataForProperty()方法. 覆盖CreateMetadata()的原因是因为AssociatedModelMetadataProvider的默认GetMetadataForProperty()实现了对CreateMetadata()的调用.它看起来像这样: public override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor,Type containerType,string propertyName) { if (containerType == null) { throw new ArgumentNullException("containerType"); } if (string.IsNullOrEmpty(propertyName)) { throw new ArgumentException(MvcResources.Common_NullOrEmpty,"propertyName"); } PropertyDescriptor propertyDescriptor = this.GetTypeDescriptor(containerType).GetProperties().Find(propertyName,true); if (propertyDescriptor == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,MvcResources.Common_PropertyNotFound,new object[] { containerType.FullName,propertyName })); } return this.GetMetadataForProperty(modelAccessor,containerType,propertyDescriptor); } protected virtual ModelMetadata GetMetadataForProperty(Func<object> modelAccessor,PropertyDescriptor propertyDescriptor) { IEnumerable<Attribute> attributes = this.FilterAttributes(containerType,propertyDescriptor,propertyDescriptor.Attributes.Cast<Attribute>()); return this.CreateMetadata(attributes,modelAccessor,propertyDescriptor.PropertyType,propertyDescriptor.Name); } 如果您正在将AssociatedMetadataProvider子类化为您提供的链接,则首选的可扩展性点是CreateMetadata方法,因为AssociatedMetadataProvider.GetMetadataForProperty()方法预先验证CreateMetadata()方法的合约.这样,您就知道如果您的CreateMetadata()方法中存在错误,您已经知道错误的来源在您的方法中,而不是在传递给它的参数中. 另外,这里是FilterAttributes()方法的源代码,以防你想知道: protected virtual IEnumerable<Attribute> FilterAttributes(Type containerType,PropertyDescriptor propertyDescriptor,IEnumerable<Attribute> attributes) { if (!typeof(ViewPage).IsAssignableFrom(containerType) && !typeof(ViewUserControl).IsAssignableFrom(containerType)) { return attributes; } return attributes.Where<Attribute>(delegate (Attribute a) { return !(a is ReadOnlyAttribute); }); } (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-4 – 全局过滤器MVC 4的执行顺序是什么
- NHibernate中对同一个对象的Lazyload要设置一致
- asp.net-mvc – 我需要有关HandleError的更多信息
- asp.net-mvc – 为什么ASP.NET MVC 4与IList for editor不能
- asp.net编程实现删除文件夹及文件夹下文件的方法
- Asp.Net超大文件上传问题解决
- ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码
- asp.net-core – ASP.Net 5类库中的EntityFramework命令?
- asp.net – 如何访问Global.asax静态成员?
- asp.net – 从DropdownList SelectedItem获取属性
- asp.net-mvc-3 – 剃刀引擎 – 如何根据不同的条
- 何时在ASP.NET上选择LAMP?
- asp.net-mvc – 为什么我的ActionFilters都没有运
- 如何在asp.net中更改javascript警告框的标题?
- asp.net – Visual Studio 2010图表控件:使Y轴成
- 中国网通新版400电话 - 企业直线
- asp.net-mvc – 为什么在我的ASP MVC4应用程序中
- asp.net-mvc – 在IIS 5.1上部署ASP.NET MVC(Win
- asp.net-mvc – 应用程序服务层作为静态类
- asp.net-mvc-4 – AngularJs,DropZone.Js,MVC4 –