为什么自定义html助手不能正确呈现标记

时间:2016-12-28 08:37:09

标签: c# html asp.net html-helper

我制作了我的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);
    }

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

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

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

但是当我使用@Html.Raw(Html.MedalImage(HtmlHelpers.Color.Red))时,它会按预期工作并呈现我的图像。有人可以告诉我为什么吗?或者如何解决我的帮助,所以我不必使用Html.Raw方法?

1 个答案:

答案 0 :(得分:2)

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