2

次のように、画像リンクを作成するカスタム ヘルパーを作成しています。

    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));

a タグのみをレンダリングし、ステートメントのすぐ後ろのテキストをカプセル化します。次に例を示します。

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

ここでの結果は、「世界」のテキストがアンカーでラップされているということですが、画像はありません。「世界」という単語はヘルパーステートメントの一部ではないため、これができるとは思いもしませんでした。

最後に、最終ステートメントを次のように変更しました。

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

これはうまくいきましたが、私の質問はなぜですか? EndTag は、そのオプションの Intellisense によって与えられた説明を見ると、特に意味があると思いました。

4

1 に答える 1

3

コードの最後の 2 行は次のようになります。

        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.

于 2012-07-13T05:02:42.013 に答える