Это ответ на комментарий Маслоу.Это мой первый вклад в SO, поэтому у меня недостаточно репутации, чтобы комментировать, поэтому я отвечаю как ответ.
Вы можете установить свойство TemplateHint в ModelMetadataProvider.Это автоматически подключит любой IEnumerable к указанному вами шаблону.Я только что попробовал это в моем проекте.Код ниже -
protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype(CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor)
{
var metaData = base.CreateMetadataFromPrototype(prototype, modelAccessor);
var type = metaData.ModelType;
if (type.IsEnum)
{
metaData.TemplateHint = "Enum";
}
else if (type.IsAssignableFrom(typeof(IEnumerable<object>)))
{
metaData.TemplateHint = "Collection";
}
return metaData;
}
Вы в основном переопределяете метод 'CreateMetadataFromPrototype' 'CachedDataAnnotationsModelMetadataProvider' и регистрируете свой производный тип в качестве предпочтительного ModelMetadataProvider.
В вашем шаблоне вы не можете получить прямой доступ кModelMetadata элементов в вашей коллекции.Я использовал следующий код для доступа к ModelMetadata для элементов в моей коллекции -
@model IEnumerable<object>
@{
var modelType = Model.GetType().GenericTypeArguments[0];
var modelMetaData = ModelMetadataProviders.Current.GetMetadataForType(null, modelType.UnderlyingSystemType);
var propertiesToShow = modelMetaData.Properties.Where(p => p.ShowForDisplay);
var propertiesOfModel = modelType.GetProperties();
var tableData = propertiesOfModel.Zip(propertiesToShow, (columnName, columnValue) => new { columnName.Name, columnValue.PropertyName });
}
На мой взгляд, я просто вызываю @ Html.DisplayForModel () и шаблон загружается.Нет необходимости указывать 'UIHint' на моделях.
Надеюсь, это имело какое-то значение.