2011-08-12 15 views
4

私はでRazorビューエンジンをサポートしています(これはWebMatrixまたはASP.NET MVCにも当てはまると思いますが)@helper構文を使って、宣言的なRazor Helpersを書いています。彼らはすべて正常に動作します。しかし、私はそれらをより柔軟にして、出力の回りに「折り返す」HTMLフラグメントを渡すことができるようにしたいと思います。HTMLフラグメント(デリゲートとして)を宣言型Razorヘルパーに渡すにはどうすればよいですか?

@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>が生成されます。たとえば、私はいくつかのパラメータからHTMLリンクを生成することができヘルパー(ずっとここでは単純化)を持っています。私は、必要に応じてとても長い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>)

とまったく出力を取得していないの取得:私は基本的にこのような何かをできるようにしたいと思います。

Templated Razor DelegatesについてのPhil Haackedのブログを読んでいますが、実際には可能であれば、このコンテキストでどのように使用できるのか分かりません。私は何かが欠けているか、間違った木を吠えているような気分になります。

+1

あなたは私の初めてのSO投稿にお答えしましたので、本当にお手伝いしたいと思います。悲しいことに、私はまだMS-MVCに手を付けていませんし、Razorでさえも少なくしています。ご多幸を祈る! – mikemanne

答えて

1

問題は@linkと思います。テンプレート付きカミソリデリゲートは、「マジック」パラメータ@itemを使用してデータを取得します。テンプレート内の@link@itemに置き換えてください。

また、Func<dynamic, object>を受け取るHtmlLinkメソッドのテンプレートを実行するコードを投稿してください。

+0

私の問題の一部は、テンプレートを実行するコードがないため、これを達成する方法を正確には理解できませんでした。もしあなたがそれを助けることができたら、私は自分自身が混乱していると思うので、私は感謝するでしょう:) –

+0

あなたは 'Func'を呼び出すことができます。詳細については、このブログの記事を参照してください:http://vibrantcode.com/blog/2010/8/2/inside-razor-part-3-templates.html - あなたを助けてくれることを願っています! –

+0

おかげで、それは有望に見えます - 私は仕事に戻ってきた月曜日にそれを試してみます。ああ、 "Funcを呼び出す"はクールなフレーズです:) –

1

他の誰かがこれを探している場合には、私は一緒に次のように動作します。空の文字列の場合、デリゲートがnullの場合(下の完全ではないテストに基づいています)

キーは、魔法の@itemパラメータを使用するようにJakubが言うとおりです。

@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>) 
+0

うわー、ありがとう、本当によかった! –

関連する問題