情報応用演習Ⅰ(2024)

【T5b】モデルとデータベースの連携(後編)(4/8)

プロジェクトタイプ(注意: 本文参照)
プロジェクト名T5b
ソリューション名PIT5
注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については準備作業を参照せよ.

5b-4. Indexアクションとビューの作成

まずはIndexアクションから実装していこう.このアクションではデータベースに存在しているすべての学生情報を 表示することにする1. このためにIndexアクションではT5bContextクラスのフィールド_contextから全学生の情報を取得して,それ自体をモデルクラスとしてビューに渡す. StudentsControllerクラスのIndexアクションを_に示すように書き換えよう.

StudentsControllerクラスの変更内容(Indexアクション(GETのみ))
1
2
3
4
5
6
7
8
9
// Indexアクション(GETのみ)
public IActionResult Index()
{
    var students = from s in _context.Students //
                   orderby s.Id ascending      // LINQを使って全学生情報をIDの昇順に取得
                   select s;                   //

    return View(students.ToList());            // 取得した情報をリスト化してビューに渡す
}

4~6行目では,LINQを使ってT5bContextクラスのStudentsプロパティにアクセスしてデータベース上のテーブルから全学生の情報を取得している. 8行目では取得した情報をリスト化してそれ自体をモデルとしてビューに渡している.チュートリアル【T4a】で見たように View()メソッドには, そのアクションに対応するビュー で表示/編集するモデルクラスのインスタンスを渡すことができる. 今回はまだこのIndexアクションに対応するビューは作成していないが,後述するようにこのアクションに対応するビューでは Studentクラスのリスト をモデルクラスとして指定する予定である.

次にこのIndexアクションのためのビューを作成する. Views フォルダにコントローラー名と 同名のフォルダを作成して,このなかにIndexという名前のビューを追加する. 今回はレイアウトページを使用しているので, 「レイアウトページを使用する」のチェックはオン にして作成することに注意する. Views/Students/Index.cshtml を_のように変更する.

Views/Students/Index.cshtmlの変更内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@model IEnumerable<Student>

@{
    ViewData["Title"] = "学生一覧";
    
    if (Model is null) throw new ArgumentNullException(nameof(Model)); // ad-hoc!: 非null保証のための回避策
}

<p>人数:@Model.Count()</p>

<ul>
    @foreach(var s in Model)
    {        
        <li>@s.Id: @s.LastName @s.FirstName</li>
    }
</ul>

<a asp-action="Create">新規作成</a>

1行目で@modelディレクティブでモデルクラスとしてIEnumerable<Student>を指定している. これでIndex()メソッドの戻り値の部分でView()メソッドの引数で渡したオブジェクトが モデルクラスとして用いられる.

9行目では学生の人数を表示し,11~16行目では全学生の情報を ul 要素として 表示している.表示する情報は学生のID(@s.ID),姓(@s.LastName),名(@s.FirstName)である. また18行目では asp-action タグヘルパーを使用してCreateアクションへのリンクを貼っている.

ここまで一度実行してみよう._のように表示されるはずである.まだデータベースには1件も 学生を登録していないので「人数: 0」とのみ表示されている.

実行結果

  1. この動作は本番のシステムでは好ましくない.なぜならデータベースには何千という学生情報が表示されている可能性があり,一度にすべてを表示するには極めて時間がかかってしまう場合があるためである.このため一覧表示が必要な場合はページングを行って一度に表示されるデータ量を一定にするのが一般的である. ↩︎

Last updated on 2024-05-10
Published on 2024-05-10

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.