Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9366

ASP.NET Core MVC 3.1 入門 その3 「Controller」

$
0
0

はじめに

ASP.NET Core MVC 3.1 のコントローラーついて、自分が学んだことを備忘録として記載します。
このフレームワークに殆ど触れたことが無い方に少しでも参考になれば幸いです。
誤り等あれば、ご指摘頂けますと大変喜びます。

前回の記事

ASP.NET Core MVC 3.1 入門 その2 「MVCプロジェクトの基本構造」

今回の流れ

  • MVCパターンの説明
  • コントローラーの説明
  • コントローラーを作ってみる
  • アクションメソッドの説明
  • 動かしてみる
  • 振り返り

今回のゴール

  • MVCパターンにおけるコントローラーの役割を理解する
  • コントローラーを追加できる
  • アクションメソッドが何かを理解する

環境

IDE
Visual Studio 2019
言語
C#

MVCパターン

コントローラーの説明に入る前に、
まずはMVCパターンについて確認しておきましょう。
全体像を把握したうえで、コントローラーについて具体的にみていきます。

MVCパターンとは

画面表示と、ビジネスロジックの分離を実現するためのアーキテクチャ(設計手法)です。

要はHTMLの生成といった画面表示のための処理と
DBアクセスのようなデータの管理/操作をするための処理
これらを分離させるために先人が考え出したプログラムの作り方の一つです。

MVCというのは構成要素の略称で、以下の単語の先頭文字をそれぞれ取り出したものです。

Model – View – Controller

実現できると、それぞれが分離しているので変更・修正があった場合、お互いに影響を受けづらく、Testability (テスト容易性) が高まるというメリットがあります。

画面に表示する項目の書式変更によってDBアクセス処理に影響が出たり、
DBの軽微な定義変更によって画面表示処理に影響が出るといった事態が発生しづらくなります。

各要素の役割

要素概要
Modelデータの管理/操作といったビジネスロジックを担当
Viewデータ入力用のフォーム、処理結果の表示といったアプリケーションのフロントエンドを担当
ControllerModelとViewの橋渡しを担当

コントローラー

コントローラーとは

MVCの全体像を把握したうえで、 コントローラー(Controller)について具体的にみていきます。
MVCにおいて、 ModelViewの橋渡しを担当する要素です。

Viewから受け取った生データを Modelに引き渡し、
Modelでの処理結果を Viewに返す

というのが主なお仕事です。

よくある会員登録処理で、 コントローラーのお仕事を確認してみましょう。

  1. 会員登録フォームに入力された情報を Viewから受け取る
    Viewから生データを受け取る
  2. 実際の会員登録処理(DBアクセス)を担当する Modelに情報を引き渡す
    → 受け取ったデータを Modelに引き渡す
  3. 会員登録の処理結果(成功/既登録により失敗 etc)を受け取る
    Modelから処理結果を受け取る
  4. ユーザーに会員登録の処理結果を通知するために、 Viewへ処理結果を返してあげる
    → 受け取った処理結果を Viewに返す

コントローラーを追加する

では実際にコントローラーを作ってみましょう。

ASP.NET Core MVC 3.1 のプロジェクトを作成する

まずは「Web アプリケーション(モデル ビュー コントローラー)」テンプレートでプロジェクトを作成します。

image.png

ソリューションエクスプローラーを眺める

各フォルダ/ファイルの概要については前回の記事をご参照ください。
お作法として、 コントローラーは必ずControllersフォルダ配下に配置してください。

image.png

コントローラーの追加

既にテンプレートに含まれているHomeControllerが存在しますが、
新しいコントローラーを追加してみます。

Controllersフォルダを右クリック > 追加 > コントローラー

と進んでください。

image.png

スキャフォールディング

以下のようなウィンドウが立ち上がると思います。
「スキャフォールディング」というのは、要は雛形を自動生成する機能のことを示します。
今回はコントローラーの雛形を自動生成してもらうために、この機能を使います。

最初から全ての コントローラーの基底クラスとなるControllerクラスを継承してくれたり、読み取りや書き込み用のメソッドを用意してくれたりと、手間が省けるので、 コントローラーを追加する際には普通にクラスとして追加するのではなく、この手順でスキャフォールディング機能を利用することをおすすめします。

今回は「MVC コントローラー - 空」を選択します。
よりリッチな雛形(CRUDに相当するメソッドが用意されている)もありますが、まずはまっさらなコントローラーを使っていきましょう。

image.png

続いてファイル名ですが、HelloControllerとします。
ここで重要なのは末尾をControllerとすることです。
末尾がControllerでないと、そのままではコントローラーとして検出されません。
※末尾がControllerでない場合は、Controller属性を付与する必要があります。
クラス名からControllerを取り除いた部分がコントローラー名とみなされます。

image.png

コントローラークラス

以上でコントローラーは追加できたと思います。
では、追加されたコントローラーのコードを見ていきましょう。

HelloController

まず注目して頂きたいのは、Controllerクラスを継承している点です。
コントローラーは通常Microsoft.AspNetCore.Mvc.Controllerクラスを継承します。
※前身のASP.NET MVC では必須でした。

publicclassHelloController:Controller{publicIActionResultIndex(){returnView();}}

アクションメソッド

次にIndexというメソッドをみていきます。
今回は「MVC コントローラー - 空」を使用しましたが、このIndexメソッドは最初から定義されています。

このメソッドは「アクションメソッド」と呼ばれるものです。

publicIActionResultIndex(){returnView();}

アクションメソッドとは

クライアントからの1リクエスト(ex 登録ボタンの押下)に対して、具体的な処理内容を定義するメソッドです。
上記のIndexメソッドが正にアクションメソッドとなります。
Controllerクラスとは、関連性を持った複数のアクションメソッドによって構成されます。
逆に言えば、一つ以上のアクションメソッドを束ねたクラスがコントローラーとなります。

アクションメソッドの規約

メソッドをアクションメソッドとして定義するためには、以下に代表される規約を全て守る必要があります。

  • コントローラークラス内に定義する
  • public
  • staticでない
  • 戻り値がIActionResultオブジェクト(後述)

上記のIndexアクションメソッドは上記の規約を全て守っているので、アクションメソッドということになります。

アクションメソッドの戻り値

繰り返しになりますが、アクションメソッドとはクライアントからの1リクエスト(ex 登録ボタンの押下)に対して、具体的な処理内容を定義するメソッドです。

従って、様々な処理をおこなうことが予想されます。
当然、様々な処理の結果、結果も様々となります。

  • 文字列
  • ファイルのデータ
  • 別のページへの遷移(リダイレクト)
  • 要求されたページが存在しない という結果

上記のような様々な結果を表現するために 「IActionResult」を実装した様々なクラス(IActionResultオブジェクト)が用意されています。

このIActionResultインターフェースはアクションメソッド内での処理に代わり、実際のHTTPレスポンスを生成する機能を提供しています。
我々が、HTTPレスポンスを直接的に意識することなく、開発ができるのはこの仕組みのおかげというわけです。

代表的なIActionResultオブジェクトを以下で紹介します。

主なIActionResultオブジェクト

概要
ContentResultテキストデータを返す
JsonResultJSON 形式のデータを返す
ViewResultテンプレート(ビュー)に基づいてページを返す
FileContentResult指定されたバイト配列をファイルとして返す
RedirectResult指定のアドレスに移動(リダイレクト)する
RedirectToActionResult指定のアクションに移動(リダイレクト)する
NotFoundResultステータスコード 404(NotFound)エラー を返す
EmptyResultなにもしない

利用頻度の高いIActionResultオブジェクトについては、対応するファクトリメソッドがControllerクラスに用意されています。
対応するファクトリメソッドが存在しないものについては、自分でnewする必要があります。

代表的なものを以下に紹介します。

主なIActionResultオブジェクトのファクトリメソッド

ファクトリメソッドIActionResultオブジェクト備考
ContentContentResult
JsonJsonResult
ViewViewResultデフォルトでは「/Views/コントローラー名/アクション名.cshtml」を読み込む
FileFileContentResult
RedirectRedirectResultリダイレクト先をURLで指定する
RedirectToActionRedirectToActionResultリダイレクト先をアクション名(+コントローラー名)で指定する
NotFoundNotFoundResultステータスコードを返却する場合は、StatusCodeResultクラスを利用することもできる(対応するファクトリメソッドがないステータスコードも存在する)

動作確認

アクションメソッドを修正する

自動生成されたIndexアクションメソッドを以下のように修正します。
現時点では、Viewを追加していないので、Viewテンプレートを経由せずにテキストデータを返すContentResultを戻り値として返してみます。
Contentメソッドは、上述した通りContentResultのファクトリメソッドです。

publicclassHelloController:Controller{publicIActionResultIndex(){returnContent("Hello World!");//修正箇所}}

実行

修正したら、F5で実行してみましょう。
テンプレートで用意されているトップページが表示されると思います。

image.png

ここでアドレスバーから手入力でURLを変更します。
変更前は以下のようになっているかと思います。
XXXXXの部分はポート番号を示しています。
環境とタイミング次第で異なりますので、ご自身の画面に表示されているものから変更する必要はありません。

https://localhost:XXXXX/

以下のようにアドレスバーから手入力でURLを変更してください。
末尾にHello/Indexを追加します。

https://localhost:XXXXX/Hello/Index

変更後、Enterを押下すると、以下のように「Hello World!」表示されると思います。
以上で動作確認は終了です。

Hello/Indexとすると、なぜHelloControllerIndexアクションメソッドが呼び出せるのかについては、次回以降の記事にします。

image.png

アクションメソッドを振り返る

ここまでのおさらいも兼ねて、以下のメソッドを言葉にすると

Contentメソッドを呼び出し、テキストデータを返すための IActionResultオブジェクト(ContentResult)を生成し、戻り値として返す Indexアクションメソッド

ということになります。

publicclassHelloController:Controller{publicIActionResultIndex(){returnContent("Hello World!");}}

Viewing all articles
Browse latest Browse all 9366

Latest Images

Trending Articles