2011-04-22 3 views
3

나는 (그것이 가능하다면 나) 다음과 같은 방식으로 호출 할 수있는 HTML 도우미 방법을 작성하는 방법을 알아 내려고 노력하고있어 :은 "반환 유형"

@Html.MyHelper("some string parameter", @<text> 
    <table> 
     <tr> 
     <td>some html content in a "template" @Model.SomeProperty</td> 
     </tr> 
    </table> 
</text>) 

을 아이디어는 사용자가 자신의 템플릿을 만들어 도우미에게 전달되도록 허용하는 것입니다.

public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, string templateId, Func<object, HelperResult> template) { 
    return MvcHtmlString.Create("<script id='" + templateId + "' type='x-jquery-tmpl'>" + template.Invoke(null) + "</script>"); 
} 

을이 작동하지만, 그것도 의미가 만약 내가 이유를 이해하지 않거나 : 일부 주위를 파고으로이 코드를 내놓았다. 어떤 사람이 실제로 <text>이 백그라운드에서 무엇인지를 설명 할 수 있었고 위에서 설명한 컨텍스트에서 어떻게 사용할 수 있습니까?

감사

특수 <text> 태그는 면도기 파서는 일반적으로 코드 모드를 선택 할 경우 마크 업 코드에서 전환을 강제 할 수 있도록하기 위해 존재

답변

6

. 예를 들어 코드 모드에 if 문 기본적으로 본체 :

@if(condition) { 
    // still in code mode 
} 

이 태그가 감지되면 면도기 파서는 자동으로 모드를 마크 업으로 전환하려면 논리가 :

@if(condition) { 
    <div>Hello @Model.Name</div> 
} 

것은 당신이 전환 할 수 있습니다 단을 어떤 태그를 실제로 내보내지 않고 마크 업 모드로 전환 할 수 있습니다 (위의 경우에는 <div> 태그가 발생합니다). 그래서 다시 질문

@if(condition) { 
    // Code mode 
    <text>Hello @Model.Name <!-- Markup mode --></text> 
    // Code mode again 
} 

@if(condition) { 
    // Code mode 
    @:Hello @Model.Name<!-- Will stay in markup mode till end of line --> 
    // Code mode again 
} 

: 당신은 <text> 블록 또는 @: 구문을 사용할 수 있습니다이 경우 당신이 <text> 태그가 필요하지 않습니다 템플릿이 이미 면도기의 올바른 동작을 트리거 태그를 가지고 있기 때문에 . 당신은 쓸 수 있습니다 : 코드 컨텍스트의 내부 면도기 파서가 @<tag></tag> 패턴을 인식하고 Func<object, HelperResult>로 변환하기 때문에이 작품

@Html.MyHelper("some string parameter", @<table> 
    <tr> 
     <td>some html content in a "template" @Model.SomeProperty</td> 
    </tr> 
</table>) 

이유입니다.

당신의 예에서 생성 된 코드는 다음과 거의 같을 것이다

Write(Html.MyHelper("some string parameter",item => new System.Web.WebPages.HelperResult(__razor_template_writer => { 
    WriteLiteralTo(@__razor_template_writer, "<table>\r\n  <tr>\r\n  <td>some html content in a \"template\" "); 
    WriteTo(@__razor_template_writer, Model.SomeProperty); 
    WriteLiteralTo(@__razor_template_writer, "</td>\r\n  </tr>\r\n </table>"); 
}))); 
+0

감사를 자세한 설명. 내가 올바르게 이해하면,''은 단지 Razor가 나의 의도를 이해하는데 도움이되는 "가짜"태그이지만 결과의 HTML에는 표시되지 않을 것이며, 예제의 '

'은 그대로 출력물에 나타날 것입니다 "진짜"꼬리표. –

+0

예, ''은 단지 거짓 태그입니다. – marcind

+0

설명 주셔서 감사합니다! 나는 이것을 찾고 있었다. – Michael