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