1 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
我將通過建議您不要使用此類代碼污染您的視圖來介紹此答案。更好的解決方案是創(chuàng)建一個(gè)自定義HtmlHelper擴(kuò)展方法來生成 html,這為您提供了更大的靈活性,可以進(jìn)行單元測(cè)試,并且可以重用。
您需要更改的第一件事是視圖中的模型聲明
@model object
否則你會(huì)拋出這個(gè)異常(List<DisplayPersonViewModel>不是IEnumerable<object>或IPagedList<object>,但它是object)
需要注意的是,目前尚不清楚,如果你想ModelMetadata為type在集合或集合中的每個(gè)項(xiàng)目,所以我既包括,加代碼,獲取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);
....
請(qǐng)注意,使用反射來確定循環(huán)的每次迭代中是否存在該屬性是低效的,我建議您這樣做一次(基于typeMetadata)。然后您可以(例如)生成一個(gè)bool值數(shù)組,然后在循環(huán)中使用索引器來檢查值)。更好的選擇是讓您的ShowOnIndexView屬性實(shí)現(xiàn)IMetadataAware并向AdditionalValuesof添加一個(gè)值,ModelMetadata以便var onIndex根本不需要代碼。有關(guān)實(shí)現(xiàn)的示例IMetadataAware,請(qǐng)參閱CustomAttribute 反映 html 屬性 MVC5
- 1 回答
- 0 關(guān)注
- 176 瀏覽
添加回答
舉報(bào)