2012-07-12 62 views
2

我创建一个自定义的辅助函数来建立图片链接的范围内:MVC的HTML帮助不会呈现图像的链接

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为该选项提供的描述时。

回答

3

最后两行代码的应该是:

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

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

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

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

我想结束标记更有意义

你可以这样想,但TagRenderMode.EndTag只呈现结束标记。 TagRenderMode.Normal正是您所追求的,因为它创建了一个普通的HTML标记并允许InnerHtml

+0

谢谢你。 – Jacques 2012-07-13 09:11:21

+0

一个问题。当你渲染链接标签时,你应该使用TagRenderMode.EndTag,因为你希望链接有一个明确的结尾? – Jacques 2012-07-13 09:12:16

+0

我可以看到你的意思,但tagbuilder的默认行为是创建一个带有开放标签和结束标签的html标签。明确地看到模式结束标签会迫使它只创建结束标签。当你想要在你的代码中创建一大块html时,它会很有用,然后在最后指定一个结束标记。希望这是有道理的 – jzm 2012-07-14 02:25:14