Могу ли я использовать атрибут описания для назначения текста метки?

В объекте 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"/>

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


person Ronnie    schedule 08.04.2009    source источник


Ответы (2)


Лучше всего было бы написать метод расширения для 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;
}

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

person Matt Murrell    schedule 08.04.2009

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

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

person Craig Stuntz    schedule 08.04.2009