LoginSignup
4
3

More than 3 years have passed since last update.

ASP.NET Core MVC 3.1 雑記 「アクションメソッドをAjax呼び出しに限定する」

Last updated at Posted at 2020-07-06

はじめに

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>
    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経由でなければ呼び出せないようになりました。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3