2013-03-16 15 views
6

liアイテムをTagBuilderを使用してレンダリングしたいと思います。TagBuilderとASP.NET MVC 4(Razorエンジンを使用)を使用したhtmlコードのレンダリング

My機能

public static string RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "") 
     { 
      string value = string.Empty; 

      TagBuilder li = new TagBuilder("li"); 
      TagBuilder anchor = new TagBuilder("a"); 
      UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 

      if (string.IsNullOrEmpty(action) || string.IsNullOrEmpty(controller)) 
      { 
       anchor.MergeAttribute("href", "#"); 
      } 
      else 
      { 
       anchor.MergeAttribute("href", urlHelper.Action(action, controller, new 
       { 
        area = isAdmin ? "Admin" : "" 
       })); 
      } 

      anchor.SetInnerText(labelText); 

      if (action.IsEqualWith(helper.ViewContext.RouteData.Values["action"].ToString())) 
      { 
       li.MergeAttribute("class", "active"); 
      } 

      if (!string.IsNullOrEmpty(listCssClass)) 
      { 
       li.MergeAttribute("class", listCssClass); 
      } 

      li.SetInnerText(anchor.ToString(TagRenderMode.Normal)); 

      return li.ToString(TagRenderMode.Normal); 
     } 

私は、次のコードを使用して呼び出すと:

@Html.RenderListTag("Home", "Index", "Contents", false) 
@Html.RenderListTag("About", "About", "Home", false) 
@Html.RenderListTag("Contact", "Contact", "Home", false) 
@Html.RenderListTag("Show toolbar", "", "", false, "options no-display") 
@Html.RenderListTag("CMS", "Index", "Home", true) 

結果をテキスト、HTML、NOTタグとして印刷されます。

<li class="active">&lt;a href=&quot;/Contents&quot;&gt;Home&lt;/a&gt;</li> <li>&lt;a href=&quot;/Home/About&quot;&gt;About&lt;/a&gt;</li> <li>&lt;a href=&quot;/Home/Contact&quot;&gt;Contact&lt;/a&gt;</li> <li class="options no-display">&lt;a href=&quot;#&quot;&gt;Show toolbar&lt;/a&gt;</li> <li class="active">&lt;a href=&quot;/Admin/Home&quot;&gt;CMS&lt;/a&gt;</li> 

HTMLタグをテキストではなく印刷します。

私の間違いはどこですか?

答えて

2

使用@Html.Raw(Html.RenderListTag("CMS", "Index", "Home", true))

+0

からMVCのすべてのstrinsgをMvcHtmlStringを返す必要があり、自動的にHTMLは、私たちは(生を使用してエンコードされている) –

+0

あなたのコードが動作し、私は投票しました。しかし、私は上記の方法に従います。 –

+3

これは受け入れられる答えではありません。拡張機能を動作させるためにRawでラップする必要はありません。タグをテキストとして出力する拡張機能が正しく書かれていない(この場合)。 opの "私の誤りを見つけました"を参照 – Tod

0

に最後の行を変更してみてください:私は私のミス:)

は私は正しい方法で

ある

li.SetInnerText(anchor.ToString(TagRenderMode.Normal)); 

を使用した

return helper.Raw(li.ToString(TagRenderMode.Normal)).ToHtmlString();

+0

動作しません、私は試しました... –

+0

本当に、 'SetInnerText'は本当の問題でした! –

+0

はい、本当です。それは私の痛みでした:)) –

24

li.InnerHtml = anchor.ToString(TagRenderMode.Normal); 

私は次のようにstringからMvcHtmlStringに私の機能の種類を変更:

public static MvcHtmlString RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "") 

AND関数の戻り値は次のとおりです、

return MvcHtmlString.Create(li.ToString()); 

動作します。

+2

これは最も正しい答えです。 HTMLヘルパーを構築してHtml.Rawをレンダリングする必要があるのはなぜですか?...これはMvcHtmlString全体のポイントです。 –

+0

私はいつも使っていました: 'NET 4.0では' '新しいHtmlString(li.ToString());'( 'HtmlString'は' System.Web'にあります) –

0

このような状況では、HttpUtilityクラスの静的メソッドHtmlDecodeに親友がいます。試してください:戻り値MvcHtmlString.Create(HttpUtility.HtmlDecode(li.ToString(TagRenderMode.Normal)));

HTH

2

あなたは方法

public static MvcHtmlString RenderListTag(this HtmlHelper helper, string labelText, string action, string controller, bool isAdmin, string listCssClass = "") 
{ 
    string value = string.Empty; 

    TagBuilder li = new TagBuilder("li"); 
    TagBuilder anchor = new TagBuilder("a"); 
    UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 

    if (string.IsNullOrEmpty(action) || string.IsNullOrEmpty(controller)) 
    { 
     anchor.MergeAttribute("href", "#"); 
    } 
    else 
    { 
     anchor.MergeAttribute("href", urlHelper.Action(action, controller, new 
     { 
      area = isAdmin ? "Admin" : "" 
     })); 
    } 

    anchor.SetInnerText(labelText); 

    if (action.IsEqualWith(helper.ViewContext.RouteData.Values["action"].ToString())) 
    { 
     li.MergeAttribute("class", "active"); 
    } 

    if (!string.IsNullOrEmpty(listCssClass)) 
    { 
     li.MergeAttribute("class", listCssClass); 
    } 

    li.SetInnerText(anchor.ToString(TagRenderMode.Normal)); 

    return new MvcHtmlString(li.ToString(TagRenderMode.Normal)); 
} 
関連する問題