2015-04-17 3 views
0

У меня есть несколько объектов с длинными именами, и я бы хотел, чтобы они сокращали их в ярлыках, используя тег HTML abbr. Я использую DataAnnotations для предоставления значения DisplayName для свойства в модели представления (или класса сущности).Помощник для LabelFor, который обертывает HTML-тег

Я вручную делать это как:

<label class="myClass"><abbr title="@Html.DisplayFor(m => m.Ssn)">SSN</abbr> @Html.EditorFor(m => m.Ssn)</label>

, но это становится боль. Я хотел бы создать помощника со следующим синтаксисом.

@Html.AbbrLabelFor(m => m.Ssn, "SSN")

и выходы:

<label for="Ssn"><abbr title="Social Security Number">SSN</abbr></label>

где "Номер социального обеспечения" является значением DisplayName, а второй аргумент в помощнике тега текст аббревиатуры. Таким образом, в основном просто добавление второго аргумента в микс.

примеров, которые я видел, как правило, канавы HtmlAttributes и такой, и я хотел бы сохранить эту функциональность, например:

@Html.AbbrLabelFor(m => m.Ssn, "SSN", new { @class="myClass" })

Как продлить существующие, полнофункциональный LabelFor для реализации этого, DfnLabel и т. Д.?

+1

Это может немного помочь http://stackoverflow.com/questions/9885548/how-to-extend -mvc3-label-and-labelfor-html-helpers –

ответ

2

Ваш помощник должен выглядеть

public static MvcHtmlString AbbrLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string abbreviation, object htmlAttributes)  
{ 
    ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string name = ExpressionHelper.GetExpressionText(expression)  
    TagBuilder abbr = new TagBuilder("abbr"); 
    abbr.MergeAttribute("title", metaData.GetDisplayName()); 
    abbr.InnerHtml = abbreviation; 
    TagBuilder label = new TagBuilder("label"); 
    label.MergeAttribute("for", name); 
    label.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
    label.InnerHtml = abbr.ToString(); 

    return MvcHtmlString.Create(label.ToString()); 
} 

Edit (с перегрузкой)

public static MvcHtmlString AbbrLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string abbreviation) 
{ 
    ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string name = ExpressionHelper.GetExpressionText(expression); 
    return AbbrLabelHelper(helper, metaData, name, abbreviation, null); 
} 

public static MvcHtmlString AbbrLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string abbreviation, object htmlAttributes) 
{ 
    ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string name = ExpressionHelper.GetExpressionText(expression); 
    return AbbrLabelHelper(helper, metaData, name, abbreviation, htmlAttributes); 
} 

private static MvcHtmlString AbbrLabelHelper(HtmlHelper helper, ModelMetadata metaData, string name, string abbreviation, object htmlAttributes) 
{ 
    TagBuilder abbr = new TagBuilder("abbr"); 
    abbr.MergeAttribute("title", metaData.GetDisplayName()); 
    abbr.InnerHtml = abbreviation; 
    TagBuilder label = new TagBuilder("label"); 
    label.MergeAttribute("for", name); 
    label.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)); 
    label.InnerHtml = abbr.ToString(); 
    return MvcHtmlString.Create(label.ToString()); 
} 
+0

Красивая. Я должен передать null для HtmlAttributes, если я не хочу их, но это нормально. Спасибо. –

+0

Просто создайте еще одну перегрузку. Я скоро обновлю ответ. –

+0

Я понял, что вскоре после того, как я прокомментировал это; спасибо за обновление, хотя. –

Смежные вопросы