2013-03-16 33 views
6

我想使用TagBuilder呈現li項。使用TagBuilder和ASP.NET MVC 4(使用Razor引擎)呈現html代碼

我的功能

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標籤。

<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自動HTML編碼返回MvcHtmlString所以我們使用原始() – 2013-03-16 14:54:52

+0

您的代碼工作,我投了。但我會按照上面描述的方法。 – 2013-03-16 15:01:18

+3

這不是一個可接受的答案,擴展名不需要用Raw打包工作。以文本形式輸出標籤的擴展名沒有被正確寫入(在這種情況下)。請參閱op的「我發現我的錯誤」 – Tod 2016-08-03 15:10:51

0

嘗試改變最後一行:

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

+0

不行,我試過... – 2013-03-16 14:57:18

+0

好吧,好像'SetInnerText'是真正的問題! – 2013-03-16 14:57:57

+0

是的,的確如此。這是我的痛苦:)) – 2013-03-16 14:59:18

24

,我發現我的錯誤:)

我用

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

正確的方法是

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

我改變了我的函數的類型從stringMvcHtmlString,如:

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

和函數的返回是:

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

現在,工作。

+2

這是最正確的答案。爲什麼要花費所有的麻煩來構建一個HTML助手只需要使用Html.Raw來渲染它呢......這就是MvcHtmlString的重點。 – 2013-07-12 19:17:23

+0

我一直使用:'返回新的HtmlString(li.ToString());'(HtmlString'在'System.Web')在NET 4.0 – 2013-10-03 10:08:03

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)); 
} 
相關問題