使用MVC和Razor,我想为包含HTML的字段创建标签,即超链接。但是,当我使用Html.LabelFor()
方法时,所有HTML都在输出上进行编码。
此屏幕截图显示了所需的结果以及MVC实际输出的内容:
有没有办法为我的模型属性生成一个能够正确呈现HTML内容的标签?
我的ViewModel:
[DisplayName("I accept the <a href=\"/Terms & conditions\">Terms & 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 & conditions\">Terms & conditions</a>")
答案 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 & conditions'>Terms & conditions</a>")]