C#
 Computer >> コンピューター >  >> プログラミング >> C#

ASP.NET MVC C#におけるChildActionOnly属性とは?使い方をわかりやすく解説

ChildActionOnly属性とは?

ASP.NET MVCにおいて、[ChildActionOnly]属性が付与されたアクションメソッド(子アクション/Child Action)は、子リクエスト(child request)からのみアクセス可能です。そのため、ブラウザからURLを直接指定してアクセスすることはできません。

URL経由で直接アクセスしようとすると、実行時に次のようなエラーがスローされます。

「Child action is accessible only by a child request」(子アクションは子リクエストからのみアクセスできます)

子アクションメソッドは、ビュー(View)内でAction()RenderAction()といったHTMLヘルパーを使って子リクエストを生成することで呼び出します。ページの一部として部分ビューをレンダリングしたい場合などに活用される仕組みです。

以下は、子アクションをURLから直接呼び出そうとした際に表示されるエラー画面の例です。

ASP.NET MVC C#におけるChildActionOnly属性とは?使い方をわかりやすく解説

NonActionメソッドとの違い

[ChildActionOnly]と混同されやすいものに[NonAction]属性がありますが、両者は役割が異なります。[NonAction]属性が付いたメソッドは、Action()やRenderAction()ヘルパーからも呼び出せない、コントローラーの公開アクションとして一切扱われないメソッドです。一方、子アクションはビューからの部分レンダリング専用に利用できます。

コントローラーの実装例

using System.Collections.Generic;
using System.Web.Mvc;

namespace DemoMvcApplication.Controllers {
    public class HomeController : Controller {
        public ActionResult Index() {
            return View();
        }

        [ChildActionOnly]
        public ActionResult Countries(List<string> countries) {
            return View(countries);
        }
    }
}

この例では、国名のリストを受け取って表示するための「Countries」アクションに[ChildActionOnly]属性を付けています。これにより、このアクションは通常のURLリクエストでは実行できなくなります。

Indexビュー

親となるビュー側では、Html.Action()ヘルパーを使って子アクションを呼び出します。

@{
    ViewBag.Title = "Countries List";
}
<h2>Countries List</h2>
@Html.Action("Countries", new { countries = new List<string>() { "USA", "UK",
"India", "Australia" } })

Countriesビュー(部分ビュー)

子アクションが返すビューでは、モデルとして渡された文字列リストをループ処理で描画します。

@model List<string>
@foreach (string country in Model) {
    <ul>
        <li>
            <b>@country</b>
        </li>
    </ul>
}

実行結果

アプリケーションを実行すると、Indexビュー内に国名リストが正しくレンダリングされます。

ASP.NET MVC C#におけるChildActionOnly属性とは?使い方をわかりやすく解説

RenderAction()を使った呼び出し方法

子アクションは、Html.RenderAction()ヘルパーを使っても呼び出せます。記述方法は以下のとおりです。

@{
    Html.RenderAction("Countries", new { countryData = new List<string>() {
    "USA", "UK", "India", "Australia" } });
}

Action()とRenderAction()の違い

どちらも子アクションを呼び出せますが、動作に違いがあります。

  • Html.Action():結果をMvcHtmlStringとして返すため、そのままビューに出力できます。
  • Html.RenderAction():結果を直接レスポンスストリームへ書き込むため、@{}のコードブロック内で呼び出す必要があります。中間オブジェクトを作らない分、わずかに効率が良いのが特徴です。

補足:ASP.NET Coreの場合

なお、[ChildActionOnly]属性はASP.NET MVC 5(.NET Framework版)までの機能です。ASP.NET Coreでは子アクションの仕組み自体が廃止されており、同様の目的にはView Component(ビューコンポーネント)を使用することが推奨されています。

  1. ASP.NET MVC(C#)でViewBagを使う方法を徹底解説!基本の仕組みと実装例

    ViewBagは、C# 4.0で導入された「dynamic」機能を活用した仕組みです。この機能により、オブジェクトに対してプロパティを動的に追加することが可能になります。内部的には、Controllerクラスの基底クラスであるControllerBaseクラスが持つdynamic型のプロパティとして実装されています。ViewBagの主な特徴は以下の通りです。データはコントローラーからビューへの一方向のみで受け渡しが可能(ビューからコントローラーへの逆方向は不可)リダイレクトが発生すると、ViewBagの値はnullになる強い型付けへの変換を行わずに、任意の数のフィールドを動的に追加・取得できる

  2. C# ASP.NET Web APIのフィルターの種類と使い方を徹底解説

    ASP.NET Web APIフレームワークでは、リクエスト処理のさまざまな段階に追加のロジックを組み込むために「フィルター」が使用されます。フィルターは、ロギング、認可、キャッシュといった横断的関心事(クロスカッティングコンサーン)を実装するための仕組みであり、アクションメソッドやコントローラーに対して、宣言的またはプログラム的に適用できます。ここでは、C#のWeb APIで利用できる主なフィルターの種類について詳しく見ていきましょう。Web APIの主なフィルターの種類1. 認証フィルター(Authentication Filter)認証フィルターは、ユーザーの身元情報を検証するために使用