2009-07-24 17 views
5

Bawiłem się z niektórymi niestandardowymi pomocnikami html i teraz próbuję stworzyć taki, którego będę mógł użyć dla kart jQuery AJAX UI.Potrzebujesz pomocy w budowaniu Niestandardowego pomocnika HTML dla Asp.net MVC

Tak zrobić ajax kartach trzeba mieć tego formatu w kodzie 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> 

więc nie mogę wykorzystać actionlink bo nie sądzę, mogę dodać tag w każdym razie do actionlink.

Więc chcę stworzyć własnego helpera HTML, który ma actionLink ze znacznikiem span i ewentualnie zbuduje go później, aby zawierał nieuporządkowany na liście znacznik.

Nie jestem pewien, jak korzystać z usługi ActionLink z korzyścią dla mnie. Podobnie jak ActionLink ma 10 przeciążonych metod i nie chcę odtwarzać wszystkich 10 z nich, ponieważ wydaje się to bezcelowe. Czy jest tam coś, co mogę nazywać, czy coś w tym stylu?

Używam sposobu, który pozwala moim niestandardowym pomocnikom html pokazać się, gdy robisz "HTML". w intellisense.

na przykład miałbym:

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

więc nie jestem pewien, w jaki sposób skorzystać z tej HtmlHelper Mam przechodzącej w

ja też nie rozumiem tej części linii. kod "ten helper HtmlHelper".

Co mnie myli, to użycie słowa kluczowego "to" w parametrze. Nie jestem pewien, do czego się odnosi i dlaczego tego potrzebujesz. Nie rozumiem też, w jaki sposób, przekazując ten parametr, ale nie używając go w jakiś sposób, pozwala uzyskać pomocników Html Twojego klienta przez "Html".

Dzięki

Odpowiedz

8

Marc's answer jest doskonała.Wystarczy dodać trochę kodu:

1) Utwórz klasę statyczną z pomocnika:

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) Dodaj nazw klasy MyHtmlHelpers do web.config:

<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

Wypróbuję to tak szybko, jak tylko będę mógł. Sądzę więc, że nie ma łatwego sposobu na użycie ActionLinka i jego 10 przeciążonych metod? Muszę w zasadzie pic i wybrać to, czego potrzebuję? Co to oznacza? InnerHtml = (! String.IsNullOrEmpty (linkText))? HttpUtility.HtmlEncode (linkText): String.Empty Podobieństwo kodu HtmlEncoding? Mogę zrozumieć, dlaczego twoje sprawdzanie dla pustych, ale nie wiesz, dlaczego kodowanie go. – chobo2

+0

LinkText musi być zakodowany w HTML w celu tworzenia poprawnych znaczników i zabezpieczeń. Z MSDN: jeśli znaki takie jak spacje i znaki interpunkcyjne są przekazywane w strumieniu HTTP, mogą zostać błędnie zinterpretowane po stronie odbierającej. Kodowanie HTML konwertuje znaki niedozwolone w HTML na odpowiedniki encji znaków; –

3

this HtmlHelper helper oznacza, że ​​jest to „metoda rozszerzenie” C# 3.0 na HtmlHelper, który jest, jak tylko będą dostępne na przykład w widoku (ETC) Html. Metoda rozszerzenia jest metodą statyczną, która udaje (w czasie kompilacji) jako metoda instancji dostępna dla typu nominowanego przez this (w tym przypadku HtmlHelper). W rzeczywistości, kompilator wywołuje metodę statyczną (Html.Button({args})) tak, jakbyś miał wpisane:

MyStaticClass.Button(Html, {args}); 

Nie jest konieczne używać HtmlHelper który jest przekazywany, jeśli nie trzeba go (inded, ja nie używaj go here); głównym zadaniem (w tym przypadku) jest uczynienie kodu wygodnym do konsumpcji (jako metoda rozszerzenia); ale może być przydatne w niektórych przypadkach.

1

Nie musisz mieć HtmlHelper, aby tworzyć linki współpracujące z kartami jQuery AJAX UI.

jQuery plugin zakładki akceptuje argumentu o nazwie tabTemplate które można ustawić:

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

Zobacz documentation.

+0

Więc co robię tylko listę div i umieścić infront "#" na wszystkich herfach? Nie wiem, jak powinien wyglądać kod. Używam HtmlHelpers, ponieważ uważam je za dużo czystsze i zatrzymać kod spagetti, dlatego ich używam. Nadal chciałbym wiedzieć, jak wywołać wykonane helper HTML w niestandardowym helper HTML. – chobo2

+0

Z dokumentacji połączonej: tabTemplate: szablon HTML, z którego tworzona jest nowa karta. Miejsca zastępcze # {href} i # {label} są zastępowane etykietą url i tab, które są przekazywane jako argumenty metody dodawania. – andymeadows

+0

@ chobo2 - andymeadows ma rację. Po prostu utwórz karty w dowolny sposób i użyj opcji tabTemplate, aby jQuery dopasować do linków (lub dowolnych innych elementów), które utworzyłeś. –

Powiązane problemy