2009-07-24 4 views
5

Я играл с некоторыми пользовательскими html-помощниками, и теперь я пытаюсь создать тот, который я могу использовать для вкладок UI jQuery AJAX.Нужна помощь в создании Custom Html Helper для Asp.net MVC

Так делать Ajax вкладки вы должны иметь этот формат в вашем 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, потому что я не думаю, что я могу добавить в любом случае тег в ActionLink.

Так что я хочу создать свой собственный html-помощник, у которого есть actionLink с тегом span в нем и, возможно, позже его создать, чтобы с ним был отмечен неупорядоченный тег.

Так что я не уверен, как использовать ActionLink в свою пользу. Подобно ActionLink имеет 10 перегруженных методов, и я не хочу воссоздавать все 10 из них, поскольку это просто кажется бессмысленным. Так что я могу ссылаться на это или что-то в этом роде?

Я использую способ, с помощью которого мои пользовательские html-помощники отображаются, когда вы делаете «Html». в intellisense.

, например, я бы:

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

Так что я не знаю, как использовать эту HtmlHelper я передаю в

Я также не понимаю эту часть линии. код "this HtmlHelper helper".

Что меня смущает, так это использование ключевого слова «это» в параметре. Я не уверен, на что это ссылается и зачем вам это нужно. Я также не понимаю, как, передавая этот параметр, но не используя его, каким-то образом позволяет вашим клиентом 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) Добавить пространство имен класса MyHtmlHelpers в 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) Наслаждайтесь :):

<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

linkText должен быть закодирован в HTML для получения правильной разметки и соображений безопасности. Из MSDN: Если символы, такие как пробелы и пунктуация, передаются в потоке HTTP, они могут быть неверно истолкованы на принимающей стороне. HTML-кодирование преобразует символы, которые не допускаются в HTML в эквиваленты символов; –

3

this HtmlHelper helper означает, что это C# 3.0 «Метод расширения» на HtmlHelper, который, как он станет доступен на Html, например, в вашей точки зрения (и т.д.). Метод расширения представляет собой статический метод, который делает вид (во время компиляции) как метод экземпляра, доступный по типу, номинированному this (в данном случае HtmlHelper). В действительности, компилятор вызывает статический метод (Html.Button({args})), как если бы вы напечатали:

MyStaticClass.Button(Html, {args}); 

Это не необходимо использовать HtmlHelper, который передается, если вам не нужно это (inded, я не используйте его here); это основная работа (в данном случае) - сделать код удобным для использования (как метод расширения); но в некоторых случаях это может быть полезно.

1

Для создания ссылок, которые работают с вкладками jQuery AJAX UI, вам не нужно иметь HtmlHelper.

JQuery вкладки плагин принимает аргумент с именем tabTemplate, что вы можете установить:

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

См documentation.

+0

Итак, что я делаю только список divs и накладываю «#» на всех герцогов? Я не уверен, как должен выглядеть код. Я использую HtmlHelpers, так как я нахожу их намного чище и останавливаю код спагетти, поэтому я их использую. Я все еще хотел бы знать, как вызвать созданный помощник Html в пользовательском помощнике HTML. – chobo2

+0

Из документации по теме: tabTemplate: шаблон HTML, из которого создается и добавляется новая вкладка. Заполнители # {href} и # {label} заменяются меткой url и tab, которые передаются в качестве аргументов методу добавления. – andymeadows

+0

@ chobo2 - andymeadows - это правильно. Просто создайте свои вкладки любым способом, как вам нравится, и используйте параметр tabTemplate, чтобы получить jQuery для соответствия ссылкам (или любым другим элементам), которые вы создали. –

Смежные вопросы