使用HTML内容生成标签

时间:2015-04-24 17:13:05

标签: asp.net-mvc razor asp.net-mvc-5 label html-helper

使用MVC和Razor,我想为包含HTML的字段创建标签,即超链接。但是,当我使用Html.LabelFor()方法时,所有HTML都在输出上进行编码。

此屏幕截图显示了所需的结果以及MVC实际输出的内容:

enter image description here

有没有办法为我的模型属性生成一个能够正确呈现HTML内容的标签?

我的ViewModel:

[DisplayName("I accept the <a href=\"/Terms &amp; conditions\">Terms &amp; conditions</a>")]
public bool AcceptedTermsAndConditions { get; set; }

我的观点:

@Html.EditorFor(m => m.AcceptedTermsAndConditions)
@Html.LabelFor(m => m.AcceptedTermsAndConditions)

我还尝试将内容直接传递为&#34; labeltext&#34;参数,没有成功:

@Html.LabelFor(m => m.AcceptedTermsAndConditions, "I accept the <a href=\"/Terms &amp; conditions\">Terms &amp; conditions</a>")

4 个答案:

答案 0 :(得分:1)

我最终根据Html.LabelFor()的反编译来源编写自己的HtmlHelper方法:

public static IHtmlString HtmlLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText = null, object htmlAttributes = null)
{
    string str = labelText;
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    var htmlFieldName = ExpressionHelper.GetExpressionText(expression);
    if (str == null)
    {
        string displayName = metadata.DisplayName;
        if (displayName == null)
        {
            string propertyName = metadata.PropertyName;
            str = propertyName ?? htmlFieldName.Split(new[] {'.'}).Last();
        }
        else
        {
            str = displayName;
        }
    }
    string innerHtml = str;
    if (string.IsNullOrEmpty(innerHtml))
        return MvcHtmlString.Empty;
    var tagBuilder = new TagBuilder("label");
    tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
    tagBuilder.InnerHtml = innerHtml;
    tagBuilder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), true);
    return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}

主要变化是我使用

 tagBuilder.InnerHtml = ..

而不是原来的

 tagBuilder.SetInnerText(..)

这样提供的labelText最终不会被HTML编码。

我的用法是:

@Html.HtmlLabelFor(m => m.AcceptedTermsAndConditions)

答案 1 :(得分:0)

我明白了。而不是

@Html.LabelFor(m => m.AcceptedTermsAndConditions)

使用

Html.GetDisplayName(x => x.AcceptedTermsAndConditions)

答案 2 :(得分:0)

不是最可爱的解决方案:

@Html.Raw(@HttpUtility.HtmlDecode( Html.LabelFor(x=>x.AcceptedTermsAndConditions).ToString()))

答案 3 :(得分:-1)

尝试使用它:

[DisplayName("I accept the <a href='Terms &amp; conditions'>Terms &amp; conditions</a>")]