2012-07-12 61 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