ASPについて話します.NET Core MVC設計におけるControllerとAction設計仕様

4824 ワード

ドアを開けて山を見て、ControllerとActionとは何ですか?


Controllerはアクションのセットを定義したクラスです.Actionは、Controller内でHTTPリクエストを処理するための方法である.HTTPリクエストは、URLルーティングによりControllerの特定のアクションにマッピングされる.Actionの戻り結果は、一般的に2つに分けられます.
  • ビューのレンダリングを開始し、レンダリング結果
  • を返します.
  • は、リダイレクトとも呼ばれる他のアクションを呼び出す.ここで説明する:Post-Redirect-Getモードは、フォームの重複コミットを防止するための一般的な措置
  • である.

    コントローラの設計仕様


    コントローラを設計するには、いくつかの制約と仕様に従います.制約はより良い設計のためであり、プログラム設計の過程でいくつかの規則を約束することは、異なる設計者が相手の設計構想を理解するのに有利である.

    MVCでの制約:クラスをControllerとマークする


    クラスは少なくとも以下のいずれかの制約を満たす必要がある、ASP.NET CoreフレームワークはControllerとして認識される:
  • クラス名Controllerを接尾辞(推奨使用)
  • クラスは、ContollerまたはControllerを接尾辞とするクラス
  • から継承される.
  • クラス使用[コントローラ]プロパティ寸法
    using Microsoft.AspNetCore.Mvc;
    
    namespace App.Controllers 
    {
        // Controller 1: the class name is suffixed with "Controller"
        public class ProductController 
        {
            // Actions
        }
    
        // Controller 2: the class inherits from a class whose name is or is suffixed with "Controller"
        public class Product : Controller 
        {
            // Actions
        }
    
        // Controller 3: the class is decorated with the [Controller] attribute
        [Controller]
        public class Product 
        {
            // Actions
        }
    
        // Controller 4: preferred name
        public class ProductController : Controller 
        {
            // Actions
        }
    }
  • 実際のプロジェクトで最も一般的なのは4つ目です.つまり、Controllerから継承され、Controllerという名前の接尾辞です.このような利点は,Productのコントローラクラスとモデルクラスを区別することである.

    仕様:コントローラの設計


    Controllerを実際のプロジェクトに適用するには、次の仕様に従います.
  • プロジェクトルートの下にあるControllersフォルダにすべてのControllerクラスを配置します.これにより、コントローラクラスはControllersネームスペースの下にあり、メンテナンスコスト
  • を大幅に削減することができる.
  • コントローラクラスをMicrosoftから継承する.AspNetCore.Mvc.Controller.これにより、Controllerベースクラス実装のプロパティとメソッドを再利用できます.例えば、Viewレンダリングビューを呼び出し、RedirectToActionを呼び出して
  • にリダイレクトする.
  • ASP.NET Core Webプログラムのコントローラ名には単数名詞が用いられる.その原因はASP.NET Core Web APIプログラムのコントローラ名には複数の名詞が使用されます.このような仕様は、異なる機能のコントローラクラスを区別するのに役立ち、特に、同じプロジェクトにWebプログラムとWeb APIプログラムがある場合、
  • に役立ちます.
    カリキュラムを参照してくださいBuild Web APIs using ASP.を参照してください.NET ASP.NET Core Web APIプログラムの作成

    MVCにおけるアクションデザイン


    Controllerでのpublicメソッドは,[NonAction]で表記されている以外はActionである.Actionの主な役割は、ビジネスロジックを処理し、レンダリングされたビュー(HTMLコンテンツ)またはリダイレクトに戻ることです.設計仕様があまりありません.以下、製品名別に製品を検索する例を示します.
    次の例を見てください.この名前の製品を検索すると、フィルタリングされてレンダリングされ、検索されないとすべての製品が表示されます.
    public class ProductController : Controller 
    {
        public DatabaseContext dbContext { get; set; }
    
        public IActionResult GetProductsByName(string name) 
        {
            IList products = null;
            if(String.IsNullOrWhiteSpace(name))
            {
                products = dbContext.GetAllProducts();
            }
            else
            {
                products = dbContext.GetProductsByName(name);
            }
    
            return RedirectToAction("Index", products);
        }
    
        public IActionResult Index(IList products) 
        {
            return View(products);
        }
    }

    アクションの戻り値


    理論的にアクションメソッドは任意の戻り値を返すことができる
    public class SampleController 
    {
    
        public string SayHello() 
        {
            return "Hello, ASP.NET Core!";
        }
    
        public double Add(double a, double b) 
        {
            return a + b;
        }
    
        public IActionResult CylinderVolume(double r, double h) 
        {
            double v = Math.PI * Math.Pow(r, 2) * h;
            return new JsonResult(v);
        }
    }

    このSampleControllerを含むWebプログラムがTCP 5000ポート上でHTTP要求を傍受するように動作すると仮定する.
  • ブラウザのアドレスバーに入力した場合http://localhost:5000/sample/sayhelloEnterキーを押すと、ブラウザから送信されたHTTP要求によってSayHello操作がトリガーされます.SayHelloは、純粋なテキスト文字列「Hello,ASP.NET Core!」を返します.文字列は、HTTP応答によってブラウザに戻り、ブラウザに表示されます.
  • URL http://localhost:5000/sample/add?a=10&b=20Add操作がトリガーされ、ブラウザに30.0が表示されます.しかし、この30.0は文字列でもdouble値でもありません.JSONオブジェクトです.つまり、デフォルトではASP.NET Coreは、非IActionResultタイプの戻り値をJSONオブジェクト
  • に変換します.
  • 同理、URLhttp://localhost:5000/sample/cylindervolume?r=10&h=20CylinderVolume操作がトリガーされ、ブラウザには6283.1853071795867が表示されます.この値もJSONオブジェクトです.異なる点は、JsonResultによって明示的に変換された
  • であることである.
    戻り値を明示的にJSONオブジェクトに変換する機能を持つことはASPを意味する.NET Core Webプログラムは、Web APIプログラムとしても使用できます.しかし、このようにすると複雑さが増すだけで、プロジェクトではそれらを分けるべきだ.
    だからJsonResult以外によくあるASP.NET Core Webプログラムのアクションは、基本的にIActionResultタイプの値を返します.
    C#プログラマーとして、「IActionResultはインタフェースです.実装クラスを覚えて、戻る操作のインスタンスを作成する必要がありますか?」と聞くかもしれません.答えはいらない.ほとんどのActionは最終的に2つのことしかしないため、ビューをレンダリングするか、別のActionにリダイレクトするか、この2つの操作はMicrosoftで行われる.AspNetCore.Mvc.Controllerでは既に実現されており,それぞれViewとRedirectToActionである.

    重点を置く:


    要するに、Actionメソッドの最後の文は、基本的にreturn View(/*...*/)またはreturn RedirectToAction(/*...*/)である.
    記事は次のとおりです.https://www.yuque.com/yuejiangliu/dotnet/controllers-and-actions