4

私は、Razor ビュー エンジンをサポートするようになったUmbraco 4.7で使用する宣言型のRazor ヘルパー(@helper 構文を使用) をいくつか作成してきました(ただし、これは WebMatrix または ASP.NET MVC にも同様に適用されると思います)。それらはすべて正常に機能します。ただし、出力を「ラップ」できるHTMLフラグメントを渡すことができるように、もう少し柔軟にしたいと思います(ただし、出力がある場合のみ)。たとえば、いくつかのパラメーターから HTML リンクを生成できるヘルパー (ここではかなり簡略化されています) があります。

@helper HtmlLink(string url, string text = null, string title = null, 
string cssClass = null, bool newWindow = false)
{
    if (!String.IsNullOrEmpty(url))
    {
        System.Web.Mvc.TagBuilder linkTag = new System.Web.Mvc.TagBuilder("a");

        linkTag.Attributes.Add("href", url);
        linkTag.SetInnerText(text ?? url);

        if (!String.IsNullOrEmpty(title))
        {
            linkTag.Attributes.Add("title", title);
        }

        if (!String.IsNullOrEmpty(cssClass))
        {
            linkTag.Attributes.Add("class", cssClass);
        }

        if (newWindow)
        {
            linkTag.Attributes.Add("rel", "external");
        }

        @Html.Raw(linkTag.ToString())
    }
}

を呼び出す@LinkHelper.HtmlLink("http://www.google.com/", "Google")と、HTML 出力が生成されます<a href="http://www.google.com/">Google</a>

ただし、URL に値がある限り、生成されたハイパーリンク HTML にラップされる HTML フラグメントをオプションで渡すことができれば、すばらしいことです。私は基本的にこのようなことをしたいと思います:

@LinkHelper.HtmlLink("http://www.google.com/", "Google", @<li>@link</li>)

そして出力を得る

<li><a href="http://www.google.com/">Google</a></li>

また@LinkHelper.HtmlLink("", "", @<li>@link</li>)

出力がまったく得られません。

テンプレート化された Razor Delegatesに関する Phil Haacked のブログを読みましたが、このコンテキストでそれらをどのように使用できるかについてのコツをつかむことができません。何かを見逃しているか、間違った木を吠えているような気がします。

4

2 に答える 2

1

他の誰かがこれを探している場合に備えて..私は次のものをまとめました。空の文字列に対して機能し、デリゲートが null の場合 (以下の完全ではないテストに基づく)。

キーは、ヤクブが言うように、魔法の@itemパラメーターを使用することです。

@helper HtmlLink(string url, string text = null, 
    Func<IHtmlString, HelperResult> formatterFunction = null,  
    string title = null, string cssClass = null, bool newWindow = false)
{
    if (!String.IsNullOrEmpty(url))
    {
        System.Web.Mvc.TagBuilder linkTag = new System.Web.Mvc.TagBuilder("a");

        linkTag.Attributes.Add("href", url);
        linkTag.SetInnerText(text ?? url);

        if (!String.IsNullOrEmpty(title))
        {
            linkTag.Attributes.Add("title", title);
        }

        if (!String.IsNullOrEmpty(cssClass))
        {
            linkTag.Attributes.Add("class", cssClass);
        }

        if (newWindow)
        {
            linkTag.Attributes.Add("rel", "external");
        }

        // This is the part using the delegate
        if (formatterFunction == null)
        {
            @Html.Raw(linkTag.ToString())
        }
        else
        {
            @formatterFunction(Html.Raw(linkTag.ToString()))
        } 
    }
}

@HtmlLink("http://www.google.com", "Google")
@HtmlLink("http://www.google.com", "Google", @<b>@item</b>)
@HtmlLink("http://www.google.com", "Google", @<text><i>@item</i><br/></text>) @* <br/> fails otherwise *@
@HtmlLink("http://www.google.com", "Google", @<b>@item</b>)
@HtmlLink("", "", @<b>@item</b>)
于 2012-03-26T09:30:51.780 に答える
1

問題はにあると思います@link。テンプレート化されたカミソリ デリゲートは、'magic' パラメータを使用してデータを取得します@item。テンプレートで に置き換え@linkてみて@itemください。

また、テンプレートを実行するコードを投稿してHtmlLinkくださいFunc<dynamic, object>

于 2011-08-12T13:43:44.923 に答える