为什么自定义 html 帮助程序无法正确呈现代码



我做了我的html帮助程序方法

public static string MedalImage(this HtmlHelper helper, Color color)
{
var builder = new TagBuilder("img");
switch (color)
{
case Color.Blue:
builder.MergeAttribute("src", "/Content/Medals/blueMedal.png");
break;
default:
builder.MergeAttribute("src", "/Content/Medals/redMedal.png");
break;
}
builder.MergeAttribute("alt", "Image not found");
return builder.ToString(TagRenderMode.SelfClosing);
}

但是当我想像这样在视图中使用它时@Html.MedalImage(HtmlHelpers.Color.Red)然后呈现:

<img alt="Image not found" src="/Content/Medals/redMedal.png" />

在这种情况下,它不会生成图像,只会生成文本。

但是当我使用@Html.Raw(Html.MedalImage(HtmlHelpers.Color.Red))时,它确实按预期工作并渲染我的图像。有人可以告诉我为什么吗?或者如何修复我的帮助程序,这样我就不必使用 Html.Raw 方法?

MVC Razor 的标准行为是对所有字符串进行HTML 编码。它唯一不会这样做的时候是如果对象是一个IHtmlString,它只不过是字符串的包装接口。

通过将字符串包装为IHtmlString,Razor 会将其视为"已经编码"和"准备按原样发送"。至少有两种方法可以做到这一点:

var htmlStr1 = new HtmlString(myStringThatContainsHtml);
var htmlStr2 = new MvcHtmlString(myStringThatContainsHtml);

或应用于您的代码:

return new HtmlString(builder.ToString(TagRenderMode.SelfClosing));
return new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));

然后需要更改您的方法签名:

public static IHtmlString MedalImage(...) { ... }

有两种方式的原因是历史性的。MVC2没有IHtmlString接口,它只有MvcHtmlString类。从 MVC3 开始,创建了 IHtmlString 接口和类 HtmlString,MvcHtmlString 现在继承自 HtmlString。有关此内容的更多信息,请参阅 HtmlString vs. MvcHtmlString。

相关内容

  • 没有找到相关文章

最新更新