ASP.NET Coreのコントローラー

ASP.NET COREが登場する前は、実装したControllerは、Controller基本クラスWebApiから継承したMVCで、ApiControllerから継承しました。ASP.NET COREはMVCとWebApiを統合し、MVCとWebApiを区別しなくなりました。ASP.NET COREのコントローラーの継承構造も変更されました。他の例を見ると、Controllerから継承しているものとControllerBaseから継承しているものがあります。実際、ControllerBaseはControllerの基本クラスです。つまり、Controllerから継承する場合、実際にはControllerBaseを継承します。ControllerBaseを直接継承することを選択する必要があるのはいつですか?

ControllerBase

最初にControllerBaseのメタデータを見てみましょう

。非常に長く、完全ではありません。ControllerBaseは抽象クラスであり、多数の仮想メソッドを実装していることがわかります。これらの仮想メソッドのほとんどは、Httpステータスコードに対応しています。
たとえば、次のとおりです。

public virtual OkResult Ok(); //http status 200
public virtual NotFoundResult NotFound(); //http status 404
public virtual ForbidResult Forbid(); //http status 403
public virtual CreatedResult Created(Uri uri, [ActionResultObjectValue] object value); // http status 201
...还有很多很多...

これは明らかにRestful Api用に設計された基本クラスであるため、Restful(web api)インターフェースを設計する場合は、ControllerBaseから継承することを選択できます。これはすでにニーズを満たすことができます。

コントローラ

コントローラーのメタデータを見てください。

コントローラーも抽象クラスで、ControllerBaseから継承され、いくつかのインターフェースを継承しています。明らかに、ControllerBase以外のControllerのコンテンツは主にMVCを扱うものです。
例:Viewbag、Viewdataプロパティ、Json、Viewメソッドなど:

public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }
public virtual JsonResult Json(object data);
public virtual ViewResult View();
...

したがって、MVCシステムを実装する必要がある場合、cshtmlテンプレートとかみそりを使用してエンジンレンダリングページを試す場合は、コントローラーを継承する必要があります。

LITTLEコントローラー

ASP.NET COREフレームワークは、ControllerとControllerBaseを継承することに加えて、POCOクラスを直接Controllerにすることができます。

「コントローラー」サフィックスを使用

TestControllerは次のコードで正しく動作しますか?

    [Route("api/[controller]")]
    public class TestController 
    {
        [HttpGet]
        public string Get()
        {
            return "TestController";
        }
    }

実行:

TestControllerクラスはどのクラスからも継承しませんが、ASP.NET COREフレームワークでは機能します。ASP.NET COREフレームワークは、デフォルトで「Controller」という接尾辞が付いたクラスを見つけ、それを実際のコントローラーとして使用します。ルーティングシステムが最終的にコントローラーと一致するときにも、一致が試行されます。

ControllerAttributeを使用する

コントローラークラスに特別な要件があり、クラス名でさえ「Controller」サフィックスを追加したくない場合、別の方法はControllerAttributeを使用することです。

    [Controller]
    [Route("api/[controller]")]
    public class POCO 
    {
        [HttpGet]
        public string Get()
        {
            return "POCOController";
        }
    }

実行:

POCOクラスはどのクラスからも継承せず、 "Controller"サフィックス名はありませんが、ControllerAttributeがマークされているため、ASP.NET COREフレームワークによってコントローラーと見なされます。ルーティングシステムが最終的にコントローラーと一致したときにも一致が試行されます。

NonControllerAttributeを使用

クラス名の1つに "Controller"サフィックスが含まれていても、ASP.NET COREフレームワークでそれを検出したくない場合は、クラスにNonControllerAttributeを追加できます。したがって、ASP.NET COREフレームワークはそれを無視します。
今すぐTestControllerを変更し、さらに[NonController]を変更します。

    [NonController]
    [Route("api/[controller]")]
    public class TestController 
    {
        [HttpGet]
        public string Get()
        {
            return "TestController";
        }
    }

それを実行します:

/ api / testはもはやコントローラーと一致しません。

まとめ

  1. RESTful(Web API)インターフェイスを設計するときにControllerBaseを継承できます
  2. MVCシステムの設計時にコントローラーを継承できる
  3. POCOクラス名に「Controller」サフィックスが含まれる場合、またはControllerAttributeを追加する場合、フレームワークはそれをコントローラーと見なします
  4. NonControllerAttributeは、クラスがフレームワークによってコントローラーとして使用されることを望まない場合に追加できます。

おすすめ

転載: www.cnblogs.com/kklldog/p/aspnetcore-controller.html