1 回答
TA贡献1777条经验 获得超3个赞
我将通过建议您不要使用此类代码污染您的视图来介绍此答案。更好的解决方案是创建一个自定义HtmlHelper扩展方法来生成 html,这为您提供了更大的灵活性,可以进行单元测试,并且可以重用。
您需要更改的第一件事是视图中的模型声明
@model object
否则你会抛出这个异常(List<DisplayPersonViewModel>不是IEnumerable<object>或IPagedList<object>,但它是object)
需要注意的是,目前尚不清楚,如果你想ModelMetadata为type在集合或集合中的每个项目,所以我既包括,加代码,获取type
@model object
@{
var elements = ViewData.ModelMetadata.Properties.Where(metadata => !metadata.IsComplexType && !ViewData.TemplateInfo.Visited(metadata)).OrderBy(x => x.Order).ToList();
// Get the metadata for the model
var collectionMetaData = ViewData.ModelMetadata;
// Get the collection type
Type type = collectionMetaData.Model.GetType();
// Validate its a collection and get the type in the collection
if (type.IsGenericType)
{
type = type.GetInterfaces().Where(t => t.IsGenericType)
.Where(t => t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Single().GetGenericArguments()[0];
}
else if (type.IsArray)
{
type = type.GetElementType();
}
else
{
// its not a valid model
}
// Get the metadata for the type in the collection
ModelMetadata typeMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, type);
}
....
@foreach (var element in collectionMetaData.Model as IEnumerable))
{
// Get the metadata for the element
ModelMetadata elementMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => element, type);
....
请注意,使用反射来确定循环的每次迭代中是否存在该属性是低效的,我建议您这样做一次(基于typeMetadata)。然后您可以(例如)生成一个bool值数组,然后在循环中使用索引器来检查值)。更好的选择是让您的ShowOnIndexView属性实现IMetadataAware并向AdditionalValuesof添加一个值,ModelMetadata以便var onIndex根本不需要代码。有关实现的示例IMetadataAware,请参阅CustomAttribute 反映 html 属性 MVC5
- 1 回答
- 0 关注
- 149 浏览
添加回答
举报