ASP.NET Core入門教程4、ASP.NET Core MVCコントローラ入門


一、前言


1、この教程の主な内容

  • ASP.NET Core MVCコントローラ概要
  • ASP.NET Core MVCコントローラ操作概要
  • ASP.NET Core MVCコントローラ操作概要戻りタイプ概要
  • ASP.NET Core MVCコントローラ操作概要戻りタイプ例
  • ASP.NET Core MVCコントローラパラメータマッピング論理説明
  • ASP.NET Core MVCコントローラパラメータマッピング/取得例
  • 2、このチュートリアルの環境情報


    ソフトウェア/環境
    説明
    オペレーティングシステム
    Windows 10
    SDK
    2.1.401
    ASP.NET Core
    2.1.3
    IDE
    Visual Studio Code 1.27
    エクスプローラ
    Chrome 69
    このコードは以下のコードで調整されます.https://github.com/ken-io/asp...

    3、前置き知識


    前置きの知識が必要かもしれません
  • MVCフレームワーク/モード紹介
  • https://baike.baidu.com/item/mvc

    二、ASP.NET Core MVCコントローラの概要


    1、ASP.NET Core MVCコントローラの概要


    MVC Webフレームワークでは、ルーティングモジュールが受信した要求をマッチングし、対応するコントローラに渡して処理する.コントローラの役割は,受信した要求を処理し,ユーザ入力を解析して対応するプログラム論理を実行し,対応する出力を返すことである.
    ユーザの入力は、QueryString、FormData、HTTP Header、HTTP Bodyであってもよい.コントローラの出力フォーマットは、通常、HTML、JSON、XML、通常テキスト

    2、コントローラの定義


    すべてのControllerクラスは、Microsoft.AspNetCore.Mvc.ControllerBaseに直接または間接的に継承する必要があります.ビューエンジンと組み合わせて使用するため、ASP.NET Core MVCフレームワークにはMicrosoft.AspNetCore.Mvc.Controllerクラスが内蔵されており、いくつかのビューエンジンに必要な特性を提供しています.したがって、デフォルトではクラスを継承すればいいです.

    3、コントローラの名前


    Controllerクラスのクラス名(ClassName)は、Controller(大文字と小文字を区別しない)で終わることを推奨します.例:
  • HomeController
  • TestController

  • ルーティングモジュールは、最後のControllerをControllerNameとして削除します.では、対応するControllerNameはそれぞれHomeTestである.これもルートがControllerにマッピングされる主な識別子です.
    もちろん、コントローラクラス名(ClassName)の固定接尾辞としてControllerを使用しなくても、ルーティングモジュールはControllerNameとして完全なクラス名(ClassName)を使用します.
    ASP.NET MVCフレームワークでは、コントローラ(Controller)クラス名はControllerを接尾辞としなければならないが、ASP.NET Core MVCフレームワークではこの制限を外しています。

    以下のControllerの定義はすべて可能です.
    //  
    public class HomeController : Controller
    {
        //ControllerName=Home
    }
    
    public class HomeController : BaseController
    {
        //ControllerName=Home
    }
    
    public class Test : Controller
    {
        //ControllerName=Test
    }

    三、ASP.NET Core MVCコントローラ操作概要


    1、ASP.NET Core MVCコントローラの操作概要


    コントローラ(Controller)操作(Action)は、コントローラが要求を受信して実際に要求を処理するプログラム方法/関数である.
    Controllerは,要求を受信するとルーティングのActionNameに従って対応するActionを見つけ,そのActionのパラメータにユーザの入力をマッピングし,最終的にActionが実際に実行されてから対応する出力を返す.

    2、コントローラ操作(Action)の定義


    Actionは、コントローラで定義されている共通の非静的メソッドである必要があります.たとえば、次のようにします.
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return Content("Hello World ! -ken.io");
        }
        
        public string Test()
        {
            return "test";
        }
        
        public void DoSomething()
        {
            //DoSomething
        }
    }

    デフォルトのルーティング構成に従います.
  • Action:Index()は/home/indexの要求に応答する
  • Action:Test()は/home/testの要求に応答する
  • Action:DoSomething()は、/home/dosomethingの要求に応答する
  • .
    Controllerで共通の非静的メソッドを定義したが、このメソッドにリクエストを処理させたくない場合は、NonActionとマークすることができます.
    public class HomeController : Controller
    {
        [NonAction]
        public void LogicMethod(){
    
        }
    }

    3、コントローラ操作(Action)返却タイプ説明


    ASP.NET Core MVCは、アクション戻りタイプを定義するには、Microsoft.AspNetCore.Mvc.IActionResultインタフェースを実装するタイプでなければならない.フレームワーク自体は、このインタフェースのデフォルト実装Microsoft.AspNetCore.Mvc.ActionResultを提供し、異なるコンテンツフォーマットの要件を出力するためにActionResultクラスのサブクラスを提供する.
    ただし、Actionメソッドを定義する場合、戻り値タイプはstring、intなどと定義することもでき、これらのカスタム戻りタイプは、応答ストリームに戻る前にフレームワークによって適切なActionResultサブタイプに自動的にパッケージされます.
    一般的なActionResultサブクラスの説明
    アクション戻りタイプ
    Controller組み込み方法
    説明
    ViewResult
    View()
    Razorビューエンジンによるレンダリングにビューデータを渡す
    PartialViewResult
    PartialView()
    ビューデータをRazorビューエンジン部分ビュー(PartialView)でレンダリングする
    ContentResult
    Content()
    カスタムテキストを返す
    JsonResult
    Json()
    オブジェクトのJSONシーケンス化結果を返します
    FileResult
    File()
    書き込み応答のバイナリ出力を返します
    RedirectResult
    Redirect()
    指定したUrlにリダイレクト
    RedirectToRouteResult
    RedirectToAction(),RedirectToRoute()
    指定したアクションまたはルーティングにリダイレクト
    EmptyResult
    /
    Actionがnullを返すか、Actionが返すキーワードがvoidであることを定義するとEmptyResultとしてパッケージされます

    四、ASP.NET Core MVCアクションメソッド戻りタイプ例


    1、準備


    ControllersフォルダにActionResultTestController.csを新規作成し、テスト用にControllerクラスに継承します.
    using System;
    using Microsoft.AspNetCore.Mvc;
    
    namespace Ken.Tutorial.Web.Controllers
    {
        public class ActionResultTestController : Controller
        {
           
        }
    }

    スタータープでcsこのテストコントローラ専用ルーティングを構成する
    //  ActionResult      
    routes.MapRoute(
        name: "ActionResultTest",
        template: "art/{action}",
        defaults: new { controller = "ActionResultTest"}
    );

    2、ContentResult使用例


    ContentResultを返すアクションの定義
    public IActionResult ContentTest()
    {
       return Content("Content Result Test --ken.io");
    }

    プロジェクトを開始し、ブラウザが{host:port}/art/contenttestにアクセスすると、次の出力が表示されます.
    ContentResult Test by ken.io

    3、JsonResult使用例


    JsonResultを返すアクションの定義
    public IActionResult JsonTest()
    {
        return Json(new { Message = "JsonResult Test", Author = "ken.io" });
    }

    プロジェクトを開始し、ブラウザが{host:port}/art/jsontestにアクセスすると、次の出力が表示されます.
    {
      "message": "JsonResult Test",
      "author": "ken.io"
    }

    4、FileResult使用例


    FileResultを返すアクションの定義
    public IActionResult FileTest()
    {
        var bytes = Encoding.Default.GetBytes("FileResult Test by ken.io");
        return File(bytes, "application/text", "filetest.txt");
    }

    プロジェクトを起動し、ブラウザが{host:port}/art/jsontestにアクセスすると、ファイルfiletestがダウンロードされます.txt.ファイルの内容は次のとおりです.
    FileResult Test by ken.io

    5、Redirect使用例


    Redirect関連アクションを返す定義
    public IActionResult RedirectTest()
    {
        return Redirect("https://ken.io");
    }
    
    public IActionResult RedirectToActionTest()
    {
        return RedirectToAction("jsontest");
    }
    
    public IActionResult RedirectToRouteTest()
    {
        return RedirectToRoute("Default", new { Controller = "home", Action = "index" });
    }

    プロジェクトの開始、ブラウザアクセステスト:
  • アクセス/art/redirecttestは、https://ken.io
  • /art/redirecttoactiontestにアクセスし、/art/jsontest
  • にジャンプします.
  • /art/redirectoroutestにアクセスし、/
  • にジャンプします.

    五、ASP.NET Core MVCアクションメソッドパラメータマッピング例


    1、Actionパラメータマッピング説明


    ルーティングが対応するControllerに要求を渡すと、Controllerは対応するActionメソッドを見つけ、RouteDataまたはHTTP要求データ(QueryString、FormData、Headerなど)からそのメソッドを実行するために必要なパラメータの値を見つけます.
    パラメータに対応するデータが見つかりません.パラメータタイプがnullのタイプである場合、nullはパラメータ値として渡されます.そうしないと、フィールドが開始されます.
    また、Actionメソッドは、パラメータを定義せずに、RouteDataまたはHTTPリクエストデータ(QueryString、FormData、Headerなど)から、対応するパラメータ値を手動で取得してもよい.

    2、準備


    ControllersフォルダにParamsMappingTestController.csを新規作成し、テスト用にControllerクラスに継承します.
    using System;
    using Microsoft.AspNetCore.Mvc;
    
    namespace Ken.Tutorial.Web.Controllers
    {
        public class ParamsMappingTestController:Controller
        {
            
        }
    }

    スタータープでcsこのテストコントローラ専用ルーティングを構成する
    //            
    routes.MapRoute(
        name: "ParamsMappingTest",
        template: "pmt/{action}/{id?}",
        defaults: new { controller = "ParamsMappingTest"}
    );

    3、基礎パラメータのマッピング例


    受信ルーティングパラメータを定義するアクション
    public IActionResult GetId(int id)
    {
        return Content($"Action params mapping test by ken.io, id:{id}");
    }

    アプリケーションを起動し、ブラウザアクセス/pmt/getid/1024または/pmt/getid?id=1024では、次の出力が表示されます.
    Action params mapping test by ken.io, id:1024

    あるいはPostManなどのツールpostアクセス/pmt/getidでHTTPヘッダパラメータにid=1024を追加してリクエストを送信しても同様の出力が見られます

    4、配列パラメータのマッピング例


    受信配列パラメータを定義するアクション
    public IActionResult GetArray(string[] id)
    {
        var message = "Action params mapping test by ken.io,id:";
        if (id != null)
        {
            message += string.Join(",", id);
        }
        return Content(message);
    }

    アプリケーション起動、ブラウザアクセス/pmt/getarray/1,2または/pmt/getarray?id=1,2では、次の出力が表示されます.
    Action params mapping test by ken.io,id:1,2

    または、PostManなどのツールpostから/pmt/getarrayにアクセスしてフォームパラメータを設定してリクエストを送信すると、同じ出力が表示されます.

    5、カスタムタイプパラメータマッピング例


    プロジェクトのルートディレクトリにModelsフォルダを作成し、Personを作成します.csクラスファイル
    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    }

    カスタムパラメータを受信するアクションの定義
    public IActionResult GetPerson(Person person)
    {
        return Json(new { Message = "Action params mapping test by ken.io", Data = person });
    }

    アプリケーション起動、ブラウザアクセス/pmt/getperson?name=ken&age=18で、次の出力が表示されます.
    {
      "message": "Action params mapping test by ken.io",
      "data": {
        "name": "ken",
        "age": 18
      }
    }

    または、PostManなどのツールpostから/pmt/getpersonにアクセスし、フォームパラメータを設定してリクエストを送信すると、同じ出力が表示されます.

    6、カスタムタイプ配列パラメータマッピング例


    カスタムタイプ配列パラメータを受信するアクションの定義
    public IActionResult GetPersonList(List person)
    {
        return Json(new { Message = "Action params mapping test by ken.io", Data = person });
    }

    アプリケーションを起動し、ブラウザアクセス/pmt/getpersonlist?person[0].name=ken&person[0].age=18&person[1].name=tom&person[1].age=20では、次の出力が表示されます.
    {
      "message": "Action params mapping test by ken.io",
      "data": [
        {
          "name": "ken",
          "age": 18
        },
        {
          "name": "tom",
          "age": 20
        }
      ]
    }

    または、PostManなどのツールpostから/pmt/getpersonlistにアクセスし、フォームパラメータを設定してリクエストを送信すると、同じ出力が表示されます.

    7、JSONタイプパラメータマッピング例


    JSONタイプパラメータ受信アクションの定義
    public IActionResult GetPersonJson([FromBody]Person person)
    {
        return Json(new { Message = "Action params mapping test by ken.io", Data = person });
    }

    アプリケーションを起動すると、PostManツールでテストするしかありません.
    まずContent-Type=アプリケーション/jsonを設定
    JSONフォームパラメータを設定して要求を送信すると、対応する出力が表示されます

    8、手動取得パラメータの例


    手動取得パラメータのアクションの定義
    public IActionResult GetByHand()
    {
        return Json(new
        {
            Id = RouteData.Values["id"],
            Name = Request.Query["name"]
        });
    }

    アプリケーションが起動すると、ブラウザアクセス/pmt/getbyhand/1024?name=ken&name=tom&age=18には、次の出力が表示されます.
    {
      "id": "1024",
      "name": [
        "ken",
        "tom"
      ]
    }

    RouteData.Values["id"]:ルーティングデータからデータを取得するRequest.Query["name"]:Urlパラメータからデータを取得するRequest.Form[「name」:フォームパラメータからデータを取得する

    六、備考


    1、付録

  • 本明細書のコード例
  • https://github.com/ken-io/asp...
    この記事は、私の独立したブログに掲載されています.https://ken.io/note/asp.net-c...