ASP .NET MVC 3. habrahabr.ruにアスタリスクを付けてお気に入りに追加する例の写真としてのAjax.ActionLink

この記事では、ヘルパーメソッドAjax.ActionLink、または作成する拡張メソッドAjax.ActionImageLinkを使用して、画像付きのリンクを作成します。



手始めに、Ajax、ASP .NET MVC 3、およびそれらの共有の簡単な紹介。



AJAX (非同期JavaScriptおよびXML-「非同期JavaScriptおよびXML」)は、Webアプリケーションとの対話的なユーザーインターフェイスを構築するためのアプローチであり、Webサーバーとのブラウザーデータの「バックグラウンド」交換で構成されます。 その結果、データを更新するときにWebページが完全にリロードされず、Webアプリケーションがより高速で便利になります。



ASP .NET MVCは、 ASP .NETテクノロジーに基づいたModel-view-controller( MVC )テンプレートを実装するWebアプリケーションを作成するためのフレームワークです。



ASP .NET MVC 3でAJAXを使用するためのアクションメソッドいくつかありますが、 Ajax.ActionLinkに興味があるので 、さらに詳しく説明します。



Ajax.ActionLink



Ajax.ActionLink-渡されたパラメーターに応じて形成されたリンクを返すメソッド。クリックすると、非同期リクエストがサーバーに送信され、ページのさらなる動作が決定されます。

合計で、このメソッドをオーバーロードするための12のオプションがあります-以下は、その使用のために転送できる入力パラメーターです。



MVC 3プロジェクトでAjaxの機能を使用するには、デフォルトで/ Scriptsフォルダーにある以下のファイルを含める必要があります。





問題の声明



画像の形式でリンクを作成する必要があり(この場合はアスタリスク)、クリックするとサーバーへの非同期リクエストが発生し、応答を受信すると更新されます(画像の変更、ツールチップ):



画像



MicrosoftがAjax ActionLinkヘルパーとの連携を提供する可能性を検討した結果、 ここは自転車なしでは十分ではないという結論に達しました 。したがって、独自のヘルパーが必要です。 始めましょう。



1.空のASP .NET MVC 3プロジェクトを作成します



画像



Viewエンジンで、Razorを指定します。



画像



2. HomeControllerを追加し、Indexメソッドを表示します



画像



ビューのマスターページとして〜/ Views / Shared / _Layout.cshtmlを選択します。



画像



それで、AjaxヘルパーのExtensionメソッドを作成する必要があります。



3.拡張メソッドAjax.ActionImageLinkを作成します



Coreフォルダーをプロジェクトルートに追加し、その中に新しい静的クラスExtensions.csを追加します



画像



拡張メソッドの作成の詳細については、 こちらをご覧ください



拡張メソッドの作成に直接進みます。 したがって、画像リンクの基礎として、HTMLマークアップスタイルとhabrahabr.ruスタイルを使用すると、コンテナーのコンテンツは2つの状態で表されます。

<div class="favourite"> <a class="add" title="  " href="#"></a> </div> <div class="favourite"> <a class="remove" title="  " href="#"></a> </div>
      
      







不要なものをすべて切り離すと、コンテナ(変更するオブジェクトはUpdateTargetId)がdivになり、メソッドがクラスとタイトルが変更されたリンクの形式でHTMLマークアップを返すという結論に達します。



* ここで著者は初めて考え、次のコードを使用してメソッドを拡張することなく、これらすべてを解決できることに気付きました

 @Ajax.ActionLink(" ", "Hello", "World", null, new AjaxOptions() { }, new { @title= Model.inFavourite? "  " : "  ", @class = Model.inFavourite? "add" : "remove" })
      
      





しかし、それは単純すぎると判断し、少し風味があり、彼は仕事を複雑にしました



余分なものをすべて削除します...余分なものを追加すると、コンテナ(変更するオブジェクトはUpdateTargetIdです)がdivになり、メソッドは、タイトルと画像へのパスが変更された画像を含むリンクの形式でHTMLマークアップを返します。

 <div id="favourite"> <a href="/Home/AddOrRemoveFavourite"> <img src="/Content/images/star-off.png" title="  " /> </a> </div> <div id="favourite"> <a href="/Home/AddOrRemoveFavourite"> <img src="/Content/images/star-on.png" title="  " /> </a> </div>
      
      





注:

さまざまなメソッドを使用してお気に入りにエントリを追加/削除できますが、この記事のフレームワーク内では、1つのメソッドAddOrRemoveFavouriteが使用されます。

したがって、拡張メソッドのフレームワークを以下に示します。

  public static IHtmlString ImageActionLink(this AjaxHelper helper, string actionName, bool inFavourite, AjaxOptions ajaxOptions) { }
      
      





入力パラメーターは次のとおりです。

  1. actionName-コントローラーメソッドの名前(AddOrRemoveFavourite)。
  2. inFavourite-エントリがすでにお気に入りに追加されているかどうかのサイン。
  3. ajaxOptions-クエリ実行パラメーター。


画像のHTMLマークアップを作成するには、 TagBuilderクラスを使用します

 var builder = new TagBuilder("img"); builder.MergeAttribute("src", String.Format("/Content/images/star-{0}.png", inFavourite ? "on" : "off")); builder.MergeAttribute("title", inFavourite ? "  " : "  ");
      
      





リンクを作成するには、標準のAjax.ActionLinkメソッドを使用します。

 var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
      
      





次に、リンクテキストの置換をHTML img要素のコンテンツに追加します。

 return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
      
      





その結果、Extensions.csクラスは次の形式を取ります。

  public static class Extensions { public static IHtmlString ImageActionLink(this AjaxHelper helper, string actionName, bool inFavourite, AjaxOptions ajaxOptions) { var builder = new TagBuilder("img"); builder.MergeAttribute("src", String.Format("/Content/images/star-{0}.png", inFavourite ? "on" : "off")); builder.MergeAttribute("title", inFavourite ? "  " : "  "); var link = helper.ActionLink("[replaceme]", actionName, inFavourite, ajaxOptions).ToHtmlString(); return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing))); } }
      
      





@using MVC3_AjaxActionImageLink.Coreディレクティブを指定した後に)ビューに拡張メソッドへの呼び出しを追加すると、次のHTMLマークアップが生成されます。

 <a data-ajax="true" data-ajax-mode="replace" data-ajax-update="#favourite" ref="/Home/AddOrRemoveFavourite"> <img src="/Content/images/star-on.png" title="  " /> </a>
      
      





または

 <a data-ajax="true" data-ajax-mode="replace" data-ajax-update="#favourite" href="/Home/AddOrRemoveFavourite"> <img src="/Content/images/star-off.png" title="  " /> </a>
      
      





div、星の写真、ビュー内のメソッド呼び出し、およびAddOrRemoveFavouriteメソッド自体のみを追加することに変わりはありませんが、後者について詳しく説明したいと思います。



4. AddOrRemoveFavouriteメソッドをコントローラーに追加する



一般的に、非同期リクエストを処理するメソッドは、文字列、数値、JSONデータなどの値を返しますが、この場合、拡張メソッドが生成する新しい要素のHTMLマークアップを返す必要があります。 残念ながら(または幸いなことに)ASP .NET MVC 3にはサーバー側(コントローラーメソッドで)で拡張可能なメソッドを呼び出す機能がないため、コントローラーメソッドでコードを複製しないとマークアップを生成できません(そうでなければ、 MVC- DRY原則)。



ただし、コントローラーメソッドから、パーシャルビューへの呼び出しを返すことができます。これにより、拡張メソッドへの呼び出しが開始され、HTMLマークアップが返されます。



始めましょう。



4.1。 拡張メソッド呼び出しでパーシャルビューを追加する



ViewsフォルダーにPartialフォルダーを追加します。 部分的にお気に入りフォルダーを追加します。

[ 部分ビューとして作成 ]を選択し、 AddOrRemoveFavourites_PartialViewという名前を指定して、ビューをお気に入りフォルダーに追加します。



画像



追加した部分ビューのコンテンツに次のディレクティブを追加します。

 @using MVC3_AjaxActionImageLink.Core @Model bool
      
      





メソッド自体の呼び出し:

 @Ajax.ImageActionLink("AddOrRemoveFavourite", (bool)Model, new AjaxOptions() { UpdateTargetId = "favourite" });
      
      





ご注意 詳細を簡素化するために、この記事のモデルはbool型の静的変数になります。



Index.cshtmlのコンテンツは、拡張メソッドPartial Viewを呼び出すようになり、次のようになります。

 @using MVC3_AjaxActionImageLink.Core @model bool @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2>Index</h2> <div id="favourite"> @{ Html.RenderPartial("/Views/Partial/Favourites/AddOrRemoveFavourites_PartialView.cshtml", Model); } </div>
      
      







4.2。 AddOrRemoveFavourite非同期要求処理メソッドをコントローラーに追加し、モデルにバインドします



パーシャルビューを返すには、パスを最初のパラメーターとして渡して、PartialViewメソッドの呼び出しを指定する必要があります。 さらに、静的なbool変数を介してプリミティブな方法で状態を保存するため、モデルとして両方のビューに渡します。 HomeController.csクラスの最終バージョンを以下に示します。

  public class HomeController : Controller { public static bool inFavourite = true; public ActionResult AddOrRemoveFavourite() { if (Request.IsAjaxRequest()) { inFavourite = !inFavourite; // TODO: Add or remove favourite return PartialView("/Views/Partial/Favourites/AddOrRemoveFavourites_PartialView.cshtml", inFavourite); } return View(); } public ActionResult Index() { // TODO: Check, if row is already in favourites return View(inFavourite); } }
      
      







5.残っているものは何ですか?



最後の手順は、画像フォルダーに画像star-off.pngおよびstar-on.pngを追加すること、およびASP .NET MVC 3でAJAXを操作するスクリプトを接続することです。

 <script src="../../Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>
      
      





やってみます。



画像



クリックします



画像



おわりに



画像



それで、私たちはこの記事で何をして学びましたか:





ご注意



メソッドの名前と画像の形でリンクする原則は、Stephen WaltheのContact mangerプロジェクトから取られました。



All Articles