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

作らしかし、私はこの@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はその文字列を「既にエンコードされている」と「そのまま送信可能」として扱います。

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

そして、あなたのメソッドのシグネチャを変更する必要があります:

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

またはあなたのコードに適用される:そこにこれを行うには、少なくとも2つの方法があります

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

その理由を歴史的な2つの方法があります。 MVC2にはIHtmlStringインターフェイスがなく、MvcHtmlStringクラスのみがありました。 MVC3からIHtmlStringインターフェイスが作成され、HtmlStringクラスとMvcHtmlStringクラスもHtmlStringから継承されるようになりました。詳細はHtmlString vs. MvcHtmlStringを参照してください。

関連する問題