2016-12-28 2 views
2

내 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 면도기의 표준 동작은 인 모든 문자열을 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을 참조하십시오.