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 5,.NET Core和ASP.NET Core 5有什么区别?
- jQuery validate 根据 asp.net MVC的验证提取简单快捷的验证
- .net4.0中的ClientIDMode
- asp.net错误表单不能嵌套在元素表单中?
- 有没有办法将内部控件放在ASP.NET自定义控件中?
- asp.net-mvc-2 – ASP.NET MVC2 ModelMetadataProviders:重
- asp.net-mvc-4 – MVC 4 Razor如果拆分div标签
- asp.net-mvc – 无法在Web服务器上启动调试.调试器无法连接
- asp.net – 如何使用javascript生成假回发?
- ASP.NET成员:拒绝用户阻止CSS,页面无法正确呈现?
- asp.net中js+jquery添加下拉框值和后台获取示例
- asp.net-mvc – 有没有办法重命名RequestVerific
- asp.net – 如何使用Inno Setup脚本创建IIS应用程
- asp.net 删除项目文件/文件夹IIS重启,Session丢
- asp.net下文件上传和文件删除的代码
- asp.net-mvc – 为一个MVC视图使用两个强类型模型
- kendo-ui – 剑道网格刷新(数据绑定两次)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,
- asp.net – 请求在IIS工作进程中存在于RequestAc
- asp-classic – 哪里可以存储经典ASP的连接字符串
