C'est en réponse à Maslow commentaire. C'est ma première contribution à faire de même, donc je n'ai pas assez de réputation pour commentaire - d'où la réponse comme une réponse.
Vous pouvez définir la TemplateHint la propriété dans la ModelMetadataProvider. Ce serait de l'auto de raccordement d'un IEnumerable à un modèle que vous spécifiez. Je l'ai juste essayé dans mon projet. Le Code ci-dessous -
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;
}
En gros, vous avez remplacer le "CreateMetadataFromPrototype' méthode de la "CachedDataAnnotationsModelMetadataprovider" et enregistrer votre type dérivé de préférence ModelMetadataProvider.
Dans votre modèle, vous ne pouvez pas accéder directement au ModelMetadata des éléments dans votre collection. J'ai utilisé le code suivant pour accéder à la ModelMetadata pour les éléments de ma collection
@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 });
}
De mon point de vue, j'ai tout simplement appeler @Html.DisplayForModel() et le modèle est chargé. Il n'est pas nécessaire de spécifier UIHint' sur les modèles.
J'espère que cela a été d'une certaine valeur.