2013-03-16 8 views
6

Ich möchte li Elemente mit TagBuilder rendern.Rendern von HTML-Code mit TagBuilder und ASP.NET MVC 4 (mit Razor-Engine)

Meine Funktion

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); 
     } 

Wenn ich den folgenden Code ein Anruf mit:

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

Die Ergebnisse werden als Text nicht HTML-Tag gedruckt.

<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> 

Ich möchte das HTML-Tag nicht Text drucken.

Wo ist mein Fehler?

Antwort

2

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

+0

Alle strinsg in MVC werden automatisch verschlüsselt HTML so verwenden wir Raw() –

+0

Ihr Code funktioniert und ich habe auf. Aber ich werde meiner oben beschriebenen Methode folgen. –

+3

Dies ist keine akzeptable Antwort, Erweiterungen müssen nicht mit Raw verpackt werden, um zu funktionieren. Erweiterungen, die das Tag als Text ausgeben, wurden nicht korrekt geschrieben (In diesem Fall). Siehe op's "Ich fand meinen Fehler" – Tod

0

Versuchen Sie, die letzte Zeile Wechsel zu:

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

+0

Funktioniert nicht, ich habe versucht ... –

+0

Nun, es scheint, als wäre der 'SetInnerText' das eigentliche Problem! –

+0

Ja, stimmt. Das war mein Schmerz :)) –

24

ich meinen Fehler gefunden :)

I verwendet

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

Der richtige Weg ist

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

Ich Art von meiner Funktion string-MvcHtmlString wie geändert:

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

und die Rückkehr der Funktion ist:

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

Nun arbeitet.

+2

Dies ist die richtigste Antwort. Warum sollten Sie sich all die Mühe machen, einen HTML-Helfer zu erstellen, nur um Html.Raw zum Rendern zu benutzen? ... das ist der ganze Sinn von MvcHtmlString. –

+0

Ich habe immer verwendet: 'return new HtmlString (li.ToString());' ('HtmlString' ist in' System.Web') in NET 4.0 –

0

Für Situationen wie diese habe ich einen guten Freund in der statischen Methode HtmlDecode der HttpUtility-Klasse. Versuchen Sie Folgendes: return MvcHtmlString.Create (HttpUtility.HtmlDecode (li.ToString (TagRenderMode.Normal)));

HTH

2

Sie müssen zurückkehren ein MvcHtmlString von Verfahren

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)); 
}