はじめに
ASP.NET Core MVC 3.1 雑記となります。
自分が実際に使用したメソッドや手順を、
将来の自分に向けた備忘録として残しています。
今回の流れ
- Ajax呼び出しを判定するメソッドを作成
- Ajax呼び出しであるかを検証するアクションセレクターを作成
- アクションメソッドに適用
今回のゴール
- 特定のアクションメソッドをAjax呼び出しに限定できる
環境
- IDE
- Visual Studio 2019
- 言語
- C#
Ajax呼び出しを判定するメソッドを作成
HttpRequest クラスの拡張メソッドとして作成しました。
Headerの「X-Requested-With」が "XMLHttpRequest" であればAjax呼び出しとみなします。
より良い判定方法があれば知りたいです。
/// <summary>/// <see cref="HttpRequest"/> クラスの拡張メソッドを提供するクラスです。/// </summary>publicstaticclassHttpRequestExtensions{privateconststringAjaxRequestHeaderItem="X-Requested-With";privateconststringAjaxRequestHeaderValue="XMLHttpRequest";/// <summary>/// Ajaxによるリクエストかどうかを取得します。/// </summary>/// <param name="self"><see cref="HttpRequest"/></param>/// <returns>Ajaxによるリクエストである場合は true それ以外は false</returns>publicstaticboolIsAjaxRequest(thisHttpRequestself){if(self==null){thrownewArgumentNullException(nameof(self));}returnself.Headers!=null&&self.Headers[AjaxRequestHeaderItem]==AjaxRequestHeaderValue;}}Ajax呼び出しであるかを検証するアクションセレクターを作成
上記の IsAjaxRequest メソッドを呼び出して検証します。
/// <summary>/// Ajax呼び出しであるかを検証するアクションセレクターです。/// </summary>publicclassAjaxOnlyAttribute:ActionMethodSelectorAttribute{/// <summary>/// <inheritdoc/>/// </summary>publicoverrideboolIsValidForRequest(RouteContextrouteContext,ActionDescriptoraction){returnrouteContext.HttpContext.Request.IsAjaxRequest();}}対象のアクションメソッドに属性として付与
[HttpPost][AjaxOnly][ActionName("filterIndex")]publicIActionResultIndex(stringkeyWord){//省略}これで、AjaxOnlyAttribute を付与したアクションメソッドはAjax経由でなければ呼び出せないようになりました。