2016-12-28 1 views
2

J'ai fait ma méthode d'aide htmlPourquoi aide HTML personnalisé ne rend pas étiquette correctement

public static string MedalImage(this HtmlHelper helper, Color color) 
    { 
     var builder = new TagBuilder("img"); 
     switch (color) 
     { 
      case Color.Blue: 
       builder.MergeAttribute("src", "/Content/Medals/blueMedal.png"); 
       break; 
      default: 
       builder.MergeAttribute("src", "/Content/Medals/redMedal.png"); 
       break; 
     } 
     builder.MergeAttribute("alt", "Image not found"); 
     return builder.ToString(TagRenderMode.SelfClosing); 
    } 

Mais quand je veux l'utiliser dans la vue comme celui-ci @Html.MedalImage(HtmlHelpers.Color.Red) il rend:

<img alt="Image not found" src="/Content/Medals/redMedal.png" />

Et dans ce cas, il ne fait pas d'image, seulement du texte. Mais lorsque j'utilise @Html.Raw(Html.MedalImage(HtmlHelpers.Color.Red)), cela fonctionne comme prévu et restitue mon image. Quelqu'un peut-il me dire pourquoi? Ou comment réparer mon assistant pour ne pas avoir à utiliser la méthode Html.Raw?

Répondre

2

Le comportement standard de MVC Razor est de coder en HTML chaque chaîne. La seule fois où il ne le fera pas est si l'objet est un IHtmlString, ce qui est un peu plus d'une interface de wrapper pour les chaînes. En enveloppant votre chaîne comme IHtmlString, Razor la traitera comme «déjà encodée» et «prête à être envoyée telle quelle». Il y a au moins deux façons de le faire:

var htmlStr1 = new HtmlString(myStringThatContainsHtml); 
var htmlStr2 = new MvcHtmlString(myStringThatContainsHtml); 

ou appliqués à votre code:

return new HtmlString(builder.ToString(TagRenderMode.SelfClosing)); 
return new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing)); 

Et puis a besoin de votre signature de la méthode à modifier:

public static IHtmlString MedalImage(...) { ... } 

La raison pour laquelle il y a deux façons est historique. MVC2 n'avait pas l'interface IHtmlString, et il avait seulement la classe MvcHtmlString. À partir de MVC3, l'interface IHtmlString a été créée, ainsi que la classe HtmlString, et MvcHtmlString hérite maintenant de HtmlString. Pour plus à ce sujet, voir HtmlString vs. MvcHtmlString.