Просто текст для DisplayName - PullRequest
2 голосов
/ 06 июля 2011

Как я могу просто поставить значение DisplayName атрибута свойства модели вместо использования Html.LabelFor() на мой взгляд? Html.LabelFor() не стреляет в меня, потому что это заставляет меня <label for=""></label>, что портит макет моей страницы. Так вот пример свойства модели:

[DisplayName("House number")]
        [Required(ErrorMessage = "You must specify house number")]
        [Range(1, 9999, ErrorMessage = "You have specify a wrong house number")]
        public UInt32? buildingNumber
        {
            get { return _d.buildingNumber; }
            set { _d.buildingNumber = value; }
        }

Заранее спасибо, ребята!

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Это должно получить отображаемое имя из метаданных:

@ModelMetadata.FromLambdaExpression(m => m.buildingNumber, ViewData).DisplayName

Редактировать:

Я думаю, что вы все еще можете использовать оператор для MVC2, просто измените @:

<%: ModelMetadata.FromLambdaExpression (m => m.buildingNumber, ViewData) .DisplayName%>

3 голосов
/ 07 июля 2011

Заимствование в значительной степени от http://weblogs.asp.net/imranbaloch/archive/2010/07/03/asp-net-mvc-labelfor-helper-with-htmlattributes.aspx, Я создал метод расширения, чтобы сделать это.Он выводит теги span, которые всегда безопасны.Вы также можете изменить это, чтобы полностью исключить тег span (исключая две перегрузки, поскольку в этом случае вы никогда не получите атрибуты).

Создайте класс с этим содержимым, убедитесь, что ваши страницы импортируют пространство имен этого класса, а затем используйте его в представлении, подобном Html.DisplayNameFor(x => x.Name)

public static class DisplayNameForHelper
{
    public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        return DisplayNameFor(html, expression, new RouteValueDictionary());
    }

    public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
    {
        return DisplayNameFor(html, expression, new RouteValueDictionary(htmlAttributes));
    }

    public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes)
    {

        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
        string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
        if (String.IsNullOrEmpty(labelText))
        {
            return MvcHtmlString.Empty;
        }
        TagBuilder tag = new TagBuilder("span");
        tag.MergeAttributes(htmlAttributes);
        tag.SetInnerText(labelText);
        return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));

    }
}
2 голосов
/ 06 июля 2011

Вы можете получить его из метаданных:

<%
    var displayName = ModelMetadata
        .FromLambdaExpression(x => x.buildingNumber, Html.ViewData)
        .DisplayName;
%>

<%= displayName %>
...