【问题标题】:Helper for a LabelFor which wraps an HTML tag用于包装 HTML 标记的 LabelFor 的助手
【发布时间】:2015-04-17 23:09:02
【问题描述】:

我有一些名称很长的实体,我希望能够使用 HTML abbr 标签在标签中缩写它们。我利用 DataAnnotations 为视图模型(或实体类)中的属性提供 DisplayName 值。

我一直在手动这样做:

<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 等?

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

你的助手需要看起来像

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());
}

编辑(重载)

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());
}

【讨论】:

  • 美丽。如果我不想要它们,我必须为 HtmlAttributes 传递 null,但这对我来说很好。非常感谢。
  • 只创建另一个重载。我会尽快更新答案。
  • 我在评论后不久就意识到了这一点;感谢您更新它。
猜你喜欢
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多