Почему кажется, что шаблон списка скаффолдов не соответствует атрибуту DisplayName? - PullRequest
0 голосов
/ 21 октября 2011

Должен ли я использовать какой-либо другой атрибут, который уважает шаблон списка, или я застрял при необходимости вручную изменить источник на DisplayFor (m => m.someProperty)?

Я прочитал в другой ветке предложениечто ExpressionHelper.GetExpressionText следует использовать, но это не совсем то, что я ищу.Я хочу, чтобы мастер добавления представлений в среде IDE работал со списками, как и для других шаблонов скаффолдов, и я надеюсь, что есть атрибут, который я мог бы использовать в своих свойствах, чтобы добиться этого.

1 Ответ

0 голосов
/ 21 октября 2011

Это потому, что список может быть пустым, а с пустым списком у вас нет доступа к экземпляру типа, для которого вы получаете отображаемое имя. В результате вы теряете типизированный доступ к конкретному свойству, на которое ссылаетесь.

Например, как вы узнаете, для какого свойства использовать отображаемое имя, если у вас нет доступа к объекту

<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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...