Это потому, что список может быть пустым, а с пустым списком у вас нет доступа к экземпляру типа, для которого вы получаете отображаемое имя. В результате вы теряете типизированный доступ к конкретному свойству, на которое ссылаетесь.
Например, как вы узнаете, для какого свойства использовать отображаемое имя, если у вас нет доступа к объекту
<th>@Html.DisplayFor(f => f....,
/*
how do you get the property you want to
access here if the list is empty
*/
)</th>
Вы можете написать метод расширения, который будет принимать тип модели, но вы потеряете этот типизированный доступ.
public static IHtmlString DisplayType(this HtmlHelper html, Type modelType, string propertyName) {
object modelInstance = Activator.CreateInstance(modelType);
var data = ModelMetadata.FromStringExpression(propertyName,
new ViewDataDictionary(modelInstance));
return new HtmlString(data.DisplayName ?? propertyName);
}
@Html.DisplayType(typeof(CoolModel), "Name")
Хотя я не очень рекомендую это.
небольшое обновление - вы также можете получить к нему доступ через модель, но все же без типизированного доступа:
public static IHtmlString DisplayType<TModel, TValue>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
string propertyName) where TModel : IEnumerable {
object modelInstance =
Activator.CreateInstance(expression.Body.Type.GetGenericArguments()[0]);
var data = ModelMetadata.FromStringExpression(propertyName,
new ViewDataDictionary(modelInstance));
return new HtmlString(data.DisplayName ?? propertyName);
}