Могу ли я использовать Атрибут описания для назначения текста метки? - PullRequest
0 голосов
/ 08 апреля 2009

В объекте DTO я хотел бы жестко закодировать описание метки для визуализированного текстового поля html, чтобы я мог иметь вспомогательную функцию html, такую ​​как TextBoxWithLabel, где я передаю только объект, и он автоматически создает метку, взятую из описания атрибутов.

  public class MessageDTO
{
    public int id { get; set; }
    [Description("Insert the title")]
    public string Title { get; set; }
    [Description("Description")]
    public string Body { get; set; }
}

Тогда на моей странице просмотра я хотел бы позвонить:

<%=Html.TextBoxWithLabel<string>(dto.Title)%>

и получить в отрисованном виде

<label for="Title">Insert the title :</label>
<input id="Title" type="text" value="" name="Title"/>

Я думаю, что для достижения этого я должен использовать отражение. Это правильно или это замедлит рендеринг вида?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2009

Лучше всего было бы написать метод расширения в HtmlHelper, который использовал бы отражение для получения атрибутов из свойства. Единственная проблема заключается в том, что передача dto.Title передаст значение строки, и вам потребуется это свойство. Я думаю, вам, вероятно, потребуется передать объект и имя свойства в виде строки.

public static string TextBoxWithLabel<T>(this HtmlHelper base, object obj, string prop)
{
    string label = "";
    string input = "<input type=\"text\" value\"\" name=\"" + prop + "\"";

    Type t = sender.GetType();
    PropertyInfo pi = t.GetProperty(prop);
    object[] array = pi.GetCustomAttributes(typeof(DescriptionAttribute), false);
    if (array.Length != 0)
        label = "<label>" + ((DescriptionAttribute)array[0]).Value + "</label>";
    return label + input;
}

Точный синтаксис помощника может быть неправильным, потому что я делаю это по памяти, но вы получаете суть. Затем просто импортируйте пространство имен вашего метода расширения на страницу, и вы можете использовать эту функцию.

0 голосов
/ 08 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...