2016-12-28 10 views
2

Я сделал свой HTML вспомогательный методПочему пользовательские HTML помощник не делает тег правильно

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

Но когда я хочу использовать его в View как этот @Html.MedalImage(HtmlHelpers.Color.Red) то делает:

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

И в этом случае он не создает изображение, а только текст.

Но когда я использую @Html.Raw(Html.MedalImage(HtmlHelpers.Color.Red)), он работает должным образом и отображает мое изображение. Может кто-нибудь сказать мне, почему? Или как исправить мой помощник, поэтому мне не нужно использовать метод Html.Raw?

ответ

2

Стандартное поведение MVC Razor - это HTML-кодировка каждые строка. Единственный раз, когда он этого не сделает, - это объект IHtmlString, который не более чем интерфейс оболочки для строк.

Обернув свою строку как IHtmlString, Razor будет рассматривать ее как «уже закодированную» и «готов к отправке как-есть». Есть по крайней мере два способа сделать это:

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

или примененные к коду:

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

И тогда нужен ваш метод подписи, чтобы быть изменена:

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

Причина, по которой есть два пути: исторический. MVC2 не имел интерфейса IHtmlString, и у него был только класс MvcHtmlString. Из MVC3 был создан интерфейс IHtmlString, а также класс HtmlString, а MvcHtmlString теперь наследуется от HtmlString. Подробнее об этом см. HtmlString vs. MvcHtmlString.