2009-07-24 18 views
5

私はいくつかのカスタムHTMLヘルパーで遊んでいましたが、今はjQuery AJAX UIタブに使用できるものを作ろうとしています。ですから、私はActionLinkのにとにかくタグを追加することができないと思うので、私はActionLinkのを使用することはできませんあなたのhtmlコードにAsp.net MVCのカスタム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> 

をこの形式を持っている必要がありますAJAXのタブを行うには

私はスパンタグ付きのactionLinkを持つ独自のHTMLヘルパーを作成し、あとでそれを使って順序付けられていないリストされたタグを持つように構築したいと考えています。

このように、私の利益のためにActionLinkを使用する方法がわかりません。 ActionLinkのように10のオーバーロードされたメソッドがあり、私はそれらの10個すべてを再作成したくないのは無意味だからです。だから私はそれを参照することができますか何かのようなものですか?

「Html」を実行したときに私のカスタムhtmlヘルパーを表示する方法を使用しています。インテリセンスで。

例えば私が持っているでしょう:

だから、
public static string Button(this HtmlHelper helper, string id, string value) 

私は渡しています。このHtmlHelperのを利用する方法がわからないです

私ものラインのこの部分を理解していません。 "この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 )お楽しみください:):

<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は、それはそれはあなたのビュー(など)にHtmlインスタンス上で利用可能になる方法ですHtmlHelper上のC#3.0「拡張メソッド」、であることを意味します。拡張メソッドは、this(この場合はHtmlHelper)で指定された型で使用可能なインスタンスメソッドになるように(コンパイル時に)を装う静的メソッドです。あなたが入力したかのように実際には、コンパイラは、静的メソッド(Html.Button({args}))を呼び出します。

MyStaticClass.Button(Html, {args}); 

それはあなたが、私は、inded(それを必要としない場合で渡されHtmlHelperを使用する必要ではありません使用しないでくださいhere);主な仕事は(この場合)コードを(拡張メソッドとして)消費するのに便利にすることです。それはいくつかの場合に役立つことがあります。

1

jQuery AJAX UIタブで動作するリンクを作成するのに、HtmlHelperを持つ必要はありません。

jQueryのタブプラグインを使用すると、設定することができtabTemplate名前付き引数を受け付けます。

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

documentationを参照してください。

+0

だから私はdivのリストを作成し、すべてのherfsにinfrontを置くのですか? コードの外観はわかりません。 私はHtmlHelpersを使用しています。なぜなら、私はそれらをきれいに見つけて、スパゲッティコードを止めているのです。 私はカスタムHtmlヘルパーで作られたHtmlヘルパーを呼び出す方法を知りたいと思います。 – chobo2

+0

リンク先のドキュメントから: tabTemplate:新しいタブを作成して追加するHTMLテンプレート。プレースホルダ#{href}と#{label}は、addメソッドに引数として渡されるURLとタブラベルに置き換えられます。 – andymeadows

+0

@ chobo2 - andymeadowsが正しいです。好きなようにタブを作成し、tabTemplateオプションを使用して、作成したリンク(または他の要素)と一致するjQueryを取得します。 –

関連する問題