2013-03-16 8 views
6

Chciałbym renderować li przedmiotów za pomocą TagBuilder.Rendering kodu HTML za pomocą TagBuilder i ASP.NET MVC 4 (z silnikiem Razor)

Moja funkcja

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

gdy zgłoszę za pomocą następującego kodu:

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

Wyniki są drukowane jako tekst tag nie 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> 

Chcę wydrukować tag HTML, a nie tekst.

Gdzie jest mój błąd?

Odpowiedz

2

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

+0

Wszystko strinsg w MVC są automatycznie kodowane HTML więc używamy RAW() –

+0

swoje prace kodu i głosowali w górę. Ale będę postępować zgodnie z opisaną powyżej metodą. –

+3

To nie jest akceptowalna odpowiedź, rozszerzenia nie muszą być pakowane z Raw do pracy. Rozszerzenia wypisujące tag jako tekst nie został poprawnie napisany (w tym przypadku). Zobacz op "I found my Mistake" – Tod

0

Spróbuj zmienić ostatni wiersz:

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

+0

Nie działa, próbowałem ... –

+0

Wygląda na to, że "SetInnerText" był prawdziwym problemem! –

+0

Tak, prawda. To był mój ból :)) –

24

znalazłem mój błąd :)

użyłem

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

Prawidłowy sposób jest

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

zmieniłem rodzaj mojej funkcji z string do MvcHtmlString jak:

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

i powrót funkcji jest następująca:

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

Teraz działa.

+2

To jest najbardziej poprawna odpowiedź. Po co starać się zbudować pomocnika HTML, który musi tylko używać Html.Raw do renderowania? ... to jest cały punkt MvcHtmlString. –

+0

Zawsze używałam: 'return new HtmlString (li.ToString());' ('HtmlString' jest w' System.Web') w NET 4.0 –

0

W takich sytuacjach mam dobrego przyjaciela w statycznej metodzie HtmlDecode klasy HttpUtility. Spróbuj: zwróć MvcHtmlString.Create (HttpUtility.HtmlDecode (li.ToString (TagRenderMode.Normal)));

HTH

2

Należy zwrócić MvcHtmlString z metodą

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)); 
} 
Powiązane problemy