0

現在、aspx mvcビューをかみそりエンジンに移行中ですが、ヘルパーに関しては少し頭を悩ませています。

理由はわかりませんが、HTML拡張フォームでヘルパーを使用しようとすると、ヘルパーがマークアップではなくテキストでレンダリングされます。HTMLではなくテキストが表示されます。

拡張機能のコードは次のとおりです。

    public static string LinkButton(this HtmlHelper helper, string id, string value, string target, object htmlAttributes)
    {
        var linkButton = new TagBuilder("div");
        var attributes = new RouteValueDictionary(htmlAttributes);

        linkButton.MergeAttribute("id", id);

        //-- apply the button class to the div and any other classes to the button
        linkButton.MergeAttribute("class", attributes.ContainsKey("class") ? string.Format("linkbutton {0}", attributes["class"]) : "linkbutton");

        var content = new TagBuilder("a");
        content.MergeAttribute("href", target);
        content.InnerHtml = value;

        linkButton.InnerHtml = content.ToString();
        return linkButton.ToString();
    }

これは非常に単純な拡張であり、次のように使用されます。

[ul]
    @foreach(ViewBag.ModulesのUpModuleモジュール)
    {{
        [li] @ Html.LinkBut​​ton(module.Name、module.Value、module.Target、new {@class = "landingButton"}); [/ li]
    }
[/ ul]

明らかに間違ったhtmlタグは別として、私が台無しにしたのは何ですか?

編集 私の質問に表示する正しいマークアップを取得できず、機能しないことを十分に認識しているため、誤ったマークアップが存在することに注意する必要があります。

4

2 に答える 2

1

かみそり構文を使用してテンプレートに返される文字列は、@HTMLマークアップを直接出力しないように、デフォルトでHTMLエンコードされています。

var s = "<p>text</p>";
....
@s

次のようなものを出力します

&lt;p&gt;text&lt;/p&gt;

これを防ぐために、次HtmlHelperRaw方法を使用できます。

@Html.Raw(s)

HtmlStringまたは、 (または.NET 4より前のMvcHtmlString)を使用することもできます。

var s = new HtmlString("<p>text</p>");

HtmlString( )を使用することによりMvcHtmlString、razorは出力文字列をHTMLエンコードしないことを認識します。


したがって、特定のケースでは、を使用するか@Html.Raw(Html.LinkButton(...))、ヘルパー拡張機能の出力タイプを変更します。

public static HtmlString LinkButton(this HtmlHelper helper, string id, string value, string target, object htmlAttributes)
...
return new HtmlString(linkButton.ToString());
于 2013-01-21T21:36:43.753 に答える
0

@voroninpは、戻り型を文字列からMvcHtmlStringに切り替えることで完全に機能しましたが、この場合、宣言型ヘルパーを使用する方がより明確なオプションですが、より複雑なヘルパーの戻り型を切り替える方がはるかにうまく機能します。

于 2013-01-21T21:00:54.750 に答える