MVC Html Helper不在链接中渲染图像

时间:2012-07-12 08:32:13

标签: asp.net-mvc html-helper

我正在创建一个自定义帮助器来创建图像链接,如下所示:

    public static MvcHtmlString ImageLink(this HtmlHelper helper, string imageUrl, string imageAlt, string linkUrl, string linkTitle, string linkTarget)
{
    //create the image object
    var img = new TagBuilder("img");

    //add its attributes
    img.MergeAttribute("src", imageUrl);
    img.MergeAttribute("alt", imageAlt);

    //create the link
    var link = new TagBuilder("a");

    //add its attributes
    link.MergeAttribute("href", linkUrl);
    link.MergeAttribute("title", linkTitle);
    link.MergeAttribute("target", linkTarget);

    //set the inner html of the link to that of the img
    link.InnerHtml = img.ToString();

    //finally return the link tag
    return MvcHtmlString.Create(link.ToString(TagRenderMode.EndTag));
}

但是,当我使用它时,它根本不会呈现任何东西。 当我将最后一行更改为:

return MvcHtmlString.Create(link.ToString(TagRenderMode.SelfClosing));

它只呈现一个标记,并将文本封装在语句之外,例如:

Hello @Html.ImageLink("...params") world

这里的结果是'世界'文本被包裹在锚中,但是没有图像。我甚至没有意识到它可以做到这一点,因为“世界”这个词不是帮助声明的一部分。

我终于将最终陈述改为:

return MvcHtmlString.Create(link.ToString(TagRenderMode.Normal));

这有效,但我的问题是为什么?我认为EndTag更有意义,特别是在查看Intellisense为该选项提供的描述时。

1 个答案:

答案 0 :(得分:3)

您的代码的最后两行应为:

        link.InnerHtml = img.ToString(TagRenderMode.SelfClosing);

        return MvcHtmlString.Create(link.ToString());

您不需要TagRenderMode.Normal,因为它是默认模式。要在您的视图中使用它,您可以这样做:

@Html.ImageLink("/images/test.jpg", "testalt", "http://testlink", "linktitle", "linktarget")
  

我认为EndTag更有意义

您可以这么认为,但TagRenderMode.EndTag只会呈现结束标记。 TagRenderMode.Normal是您在创建普通HTML标记并允许InnerHtml之后所追求的。