2011-08-12 2 views
4

저는 (이제는 WebMatrix 또는 ASP.NET MVC에도 동일하게 적용된다고 생각 하겠지만)의 Razor 뷰 엔진을 지원하는 선언문 Razor Helpers (@helper 구문 사용)을 작성했습니다. 모두 잘 작동합니다. 그러나, 나는 그것들을 조금 더 유연하게 만들고 싶기 때문에 출력물 주위에 '감싸는'HTML 조각을 전달할 수있다.선언적 면도기로 HTML 조각을 (대리인으로) 전달하는 방법은 무엇입니까?

@helper HtmlLink(string url, string text = null, string title = null, 
string cssClass = null, bool newWindow = false) 
{ 
    if (!String.IsNullOrEmpty(url)) 
    { 
     System.Web.Mvc.TagBuilder linkTag = new System.Web.Mvc.TagBuilder("a"); 

     linkTag.Attributes.Add("href", url); 
     linkTag.SetInnerText(text ?? url); 

     if (!String.IsNullOrEmpty(title)) 
     { 
      linkTag.Attributes.Add("title", title); 
     } 

     if (!String.IsNullOrEmpty(cssClass)) 
     { 
      linkTag.Attributes.Add("class", cssClass); 
     } 

     if (newWindow) 
     { 
      linkTag.Attributes.Add("rel", "external"); 
     } 

     @Html.Raw(linkTag.ToString()) 
    } 
} 

@LinkHelper.HtmlLink("http://www.google.com/", "Google")를 호출하면 HTML 출력 <a href="http://www.google.com/">Google</a>을 생성하는 것입니다 : 예를 들어, 나는 몇 가지 매개 변수에서 HTML 링크를 생성 할 수있는 도우미 (많은 여기 단순화)가 있습니다.

URL이 값을 가진 한 생성 된 하이퍼 링크 HTML을 감싸는 HTML 조각을 선택적으로 전달할 수 있다면 좋을 것입니다. 나는 기본적으로 같은 것을 할 수 있도록하고 싶습니다 :

@LinkHelper.HtmlLink("http://www.google.com/", "Google", @<li>@link</li>) 

얻을 출력

<li><a href="http://www.google.com/">Google</a></li> 

또는 @LinkHelper.HtmlLink("", "", @<li>@link</li>)

과 전혀 출력을 얻을 수 없습니다.

나는 Phil Haacked의 블로그 Templated Razor Delegates에 대해 읽었지만이 컨텍스트에서 어떻게 사용할 수 있는지에 대해서는 알지 못한다. 실제로 가능하다면. 나는 뭔가를 놓치고 있거나 잘못된 나무를 짖고있는 느낌을 받는다.

+1

귀하는 저의 최초의 SO 게시글 중 하나에 답변 해 주셨습니다. 그래서 정말 도와 드리겠습니다. 슬프게도, 나는 아직 MS-MVC를 손에 들고 다녔지 만 면도기로는 더 적다. 기원합니다. – mikemanne

답변

1

나는 문제가 @link라고 생각합니다. 템플리트 면도기 대표는 '마법'매개 변수 @item을 사용하여 데이터를 가져옵니다. 템플릿에서 @link@item으로 바꾸어보세요.

또한 Func<dynamic, object>을 사용하는 HtmlLink 메서드 템플릿을 실행하는 코드를 게시하십시오.

+0

제 문제 중 일부는 템플릿을 실행하는 코드가 없기 때문에 이것을 달성하는 방법을 정확히 이해할 수 없습니다! 만약 당신이 그걸 도울 수 있다면, 내가 혼란 스러울 것 같아서 고맙겠습니다 :) –

+0

그냥 'Func'을 호출해볼 수 있습니다. 자세한 내용은 다음 블로그 게시물을 참조하십시오. http://vibrantcode.com/blog/2010/8/2/inside-razor-part-3-templates.html - 도움이되기를 바랍니다. –

+0

고마움, 그것은 유망 해 보인다 - 내가 일할 때 월요일에 그걸 시도 할 것이다. 오, 그리고 "Func를 부름"은 멋진 문구입니다 :) –

1

누군가 다른 사람이 이것을 찾고있는 경우에 .. 나는 다음과 같이 작동 할 것이다. 빈 문자열에 대한 대리자가 null 인 경우 (아래의 포괄적 인 테스트를 기반으로합니다.)

키는 Jakub의 말처럼 마법 @item 매개 변수를 사용합니다.

@helper HtmlLink(string url, string text = null, 
    Func<IHtmlString, HelperResult> formatterFunction = null, 
    string title = null, string cssClass = null, bool newWindow = false) 
{ 
    if (!String.IsNullOrEmpty(url)) 
    { 
     System.Web.Mvc.TagBuilder linkTag = new System.Web.Mvc.TagBuilder("a"); 

     linkTag.Attributes.Add("href", url); 
     linkTag.SetInnerText(text ?? url); 

     if (!String.IsNullOrEmpty(title)) 
     { 
      linkTag.Attributes.Add("title", title); 
     } 

     if (!String.IsNullOrEmpty(cssClass)) 
     { 
      linkTag.Attributes.Add("class", cssClass); 
     } 

     if (newWindow) 
     { 
      linkTag.Attributes.Add("rel", "external"); 
     } 

     // This is the part using the delegate 
     if (formatterFunction == null) 
     { 
      @Html.Raw(linkTag.ToString()) 
     } 
     else 
     { 
      @formatterFunction(Html.Raw(linkTag.ToString())) 
     } 
    } 
} 

@HtmlLink("http://www.google.com", "Google") 
@HtmlLink("http://www.google.com", "Google", @<b>@item</b>) 
@HtmlLink("http://www.google.com", "Google", @<text><i>@item</i><br/></text>) @* <br/> fails otherwise *@ 
@HtmlLink("http://www.google.com", "Google", @<b>@item</b>) 
@HtmlLink("", "", @<b>@item</b>) 
+0

와우, 정말 고마워! –

관련 문제