2009-07-24 15 views
5

용 사용자 정의 HTML 도우미 만들기 관련 정보 사용자 정의 HTML 도우미를 가지고 놀았으며 지금은 jQuery AJAX UI 탭에 사용할 수 있도록 노력하고 있습니다.Asp.net MVC

그래서 아약스 탭을 수행 할 내가이 actionLink에 어쨌든 태그를 추가 할 수 있다고 생각하지 않기 때문에 HTML 코드

<div id="example"> 
    <ul> 
     <li><a href="ahah_1.html"><span>Content 1</span></a></li> 
     <li><a href="ahah_2.html"><span>Content 2</span></a></li> 
     <li><a href="ahah_3.html"><span>Content 3</span></a></li> 
    </ul> 
</div> 

그래서 난 ActionLink을 사용할 수 없습니다에이 형식이 필요합니다.

그래서 저는 span 태그가 포함 된 actionLink가있는 자체 HTML 도우미를 만들고 나중에 순서가 지정되지 않은 태그가있는 HTML 도우미를 만들고 싶습니다.

그래서 나는 내 이익을 위해 ActionLink를 사용하는 방법을 모르겠습니다. ActionLink가 10 가지 오버로드 된 메소드를 가지고 있으며, 그 중 10 가지를 모두 다시 만들고 싶지는 않습니다. 그래서저기서 그걸 참조 할 수 있을까요?

"Html"을 할 때 내 사용자 정의 html 헬퍼가 나타나도록하는 방법을 사용하고 있습니다. Intellisense에서.

예를 들어 나는 것 :

그래서
public static string Button(this HtmlHelper helper, string id, string value) 

내가 전달하고이 Html 헬퍼을 활용하는 방법을 잘 모르겠습니다

나는 또한 라인의이 부분을 이해하지 않습니다. "이 HtmlHelper 도우미"를 코드화하십시오.

나를 혼란스럽게하는 것은 매개 변수에 "this"키워드를 사용하는 것입니다. 나는 그것이 무엇을 언급하고 있는지 왜 당신이 그것을 필요로하는지 잘 모르겠습니다. 나는 또한 어떻게이 매개 변수를 전달하지만 어떻게 든 그것을 사용하지 않으면 고객 HTML 조인자가 "Html."에 액세스 할 수 있음을 이해하지 못합니다.

감사

답변

8

Marc's answer이 우수합니다.

1) 도우미 정적 클래스를 만듭니다 :

public static class MyHtmlHelpers 
{ 
    public static string MySpecialActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues) 
    { 
     var innerTagBuilder = new TagBuilder("span") { 
      InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty 
     }; 

     TagBuilder tagBuilder = new TagBuilder("a") { 
      InnerHtml = innerTagBuilder.ToString(TagRenderMode.Normal); 
     }; 

     var urlHelper = new UrlHelper(html.ViewContext.RequestContext); 
     var url = urlHelper.Action(actionName, routeValues); 
     tagBuilder.MergeAttribute("href", url); 

     return tagBuilder.ToString(TagRenderMode.Normal); 
    } 
} 

2)의 web.config에 MyHtmlHelpers 클래스의 네임 스페이스를 추가

<pages> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="System.Linq" /> 
    <add namespace="System.Collections.Generic" /> 

    <add namespace="MyHtmlHelpers_Namespace" /> 
    </namespaces> 
</pages> 

3 그냥 몇 가지 코드를 추가) Enjoy :) :

<div id="example"> 
    <ul> 
     <li><%= Html.MySpecialActionLink("Content 1", "action1", null) %></li> 
     <li><%= Html.MySpecialActionLink("Content 2", "action2", new { param2 = "value2" }) %></li> 
     <li><%= Html.MySpecialActionLink("Content 3", "action3", new { param3 = "value3" }) %></li> 
    </ul> 
</div> 
+0

최대한 빨리 시도해 보겠습니다. 그래서 ActionLink를 사용하는 쉬운 방법이 없다고 생각합니다. 10 가지 오버로드 된 메소드가 있습니까? 기본적으로 사진을 찍고 내가 원하는 것을 선택해야합니까? 또한이 작업은 무엇입니까? InnerHtml = (! String.IsNullOrEmpty (linkText))? HttpUtility.HtmlEncode (linkText) : String.Empty 왜 HtmlEncoding하고 계십니까? 왜 비어 있는지 확인하는 이유를 이해할 수 있지만 인코딩 이유는 확실하지 않습니다. – chobo2

+0

올바른 마크 업과 보안상의 이유로 링크 텍스트를 HTML로 인코딩해야합니다. MSDN에서 : 공백과 구두점과 같은 문자가 HTTP 스트림에서 전달되면 수신 측에서 잘못 해석 될 수 있습니다. HTML 인코딩은 HTML에서 허용되지 않는 문자를 문자 엔티티로 변환합니다. –

3

this HtmlHelper helper는 그것이보기 (등)의 Html 인스턴스에서 사용할 수있게하는 방법이다 HtmlHelper에 C# 3.0 "확장 메서드"을 의미합니다. 확장 메서드는 this (이 경우 HtmlHelper)으로 지정된 형식에서 사용할 수있는 인스턴스 메서드가되도록 (컴파일 타임에) 인 것처럼 보이는 정적 메서드입니다.

MyStaticClass.Button(Html, {args}); 

그것은 내가, 당신이 (inded 필요하지 않은 경우에 전달되는 HtmlHelper를 사용하는 필요되지 않습니다 : 실제로, 컴파일러는 사용자가 입력 한 것처럼 정적 메소드 (Html.Button({args}))를 호출 사용하지 마십시오 here); 주요 작업 (이 경우)은 코드를 (확장 메소드로) 소비하기 편리하게 만드는 것입니다. 그러나 어떤 경우에는 유용 ​​할 수 있습니다.

1

jQuery AJAX UI 탭과 작동하는 링크를 만들 때 HtmlHelper을 가질 필요는 없습니다.

$("#example").tabs({ tabTemplate: "<li><a href=\"#{href}\">#{label}</a></li>" }); 

documentation를 참조하십시오

jQuery를 탭 플러그인은 사용자가 설정할 수 tabTemplate라는 이름의 인수를 받아들입니다.

+0

그래서 div의 목록을 만들고 "#"모든 herfs에 infront? 코드가 어떻게 보이는지 잘 모르겠습니다. 나는 HtmlHelpers를 사용하는데, 왜냐하면 나는 그 (것)들을 더 청결한 찾아 내고 spagetti 부호 thats를 멈춘다 그 (것)들을 왜 사용하고있다. 난 여전히 사용자 정의 HTML 도우미에서 만들어진 HTML 도우미를 호출하는 방법을 알고 싶습니다. – chobo2

+0

연결된 문서에서 : tabTemplate : 새 탭을 만들고 추가하는 HTML 템플리트입니다. placeholder # {href}와 # {label}은 add 메소드에 인수로 전달 된 url과 tab 레이블로 대체됩니다. – andymeadows

+0

@ chobo2 - andymeadows가 맞습니다. 원하는대로 탭을 만들고 tabTemplate 옵션을 사용하여 jQuery가 생성 한 링크 (또는 다른 요소)와 일치하게하십시오. –