■内容
複数項目あるモデルの定義方法
特に難しいことではないのかもしれないが、MVC5 のサンプルは、単純なテーブルが
1個だけあるようなモデルでの解説が多いため、最初に結構、検索に時間を費やした。
■方法
※前項「1.MVC5 データベースファースト テーブル値関数の使用方法」にて、テーブル値関数
から自動生成した「売上入金速報_Result」モデルを使用する。
●モデルの作成
検索条件を設定する画面と、検索結果を表示する画面で共通に使用するモデルを定義する
1.「ソリューションエクスプローラ」
・「Models」フォルダ右クリック→追加→新しい項目
2.「新しい項目の追加
・左列で「Visual C#」を選択
・中央で「クラス」を選択
・「名前」を入力(なんでも良いが画面名.csにすると解りやすい)
・[追加]ボタンクリック
3.空のクラスが生成されるので、条件設定画面/結果表示画面用の項目及び、
View の表示方法の切り替えなどに使用する項目を追加する。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace mobile.Models
{
public class 売上入金速報
{
public Decimal 社員番号 { get; set; }
public DateTime 当日 { get; set; }
public DateTime 累計開始日 { get; set; }
public DateTime 累計終了日 { get; set; }
public int グループ数 { get; set; }
// public IQueryable<売上入金速報_Result> 売上入金速報_Result { get; set; }
public 売上入金速報_Result[] 売上入金速報_Result { get; set; }
}
}
※最初、IQueryable型 にしていたが、後で重大な欠陥に気付き、単純な Array に変更した。
→「12.LinQ の遅延実行に泣く」を参照
↑を踏まえた上でなら、「IQueryable」にするのが正しい気がする。
●コントローラの作成
検索条件を設定する画面と、検索結果を表示する画面で共通に使用するコントローラを定義する
1.「ソリューションエクスプローラ」
・「Controllers」フォルダ右クリック→追加→コントローラ
2.「スキャフォールディングの追加」画面
・左列で「コントローラ」を選択
・中央で「MVC 5 コントローラ - 空」を選択
・[追加]ボタンクリック
・「コントローラ名」に名前(なんでも良いが画面名にすると解りやすい)と、"Controller"
(デフォルト表示)を入力し、[追加]ボタンクリック
3.空のクラスが生成されるので、条件設定画面/結果表示画面用の処理を追加する
public class 売上入金速報Controller : Controller
{
private 業務DBEntities 業務DB = new 業務DBEntities();
[Authorize]
public ActionResult 条件設定(DateTime? 当日, DateTime? 累計開始日, DateTime? 累計終了日)
{
売上入金速報Model model = new 売上入金速報Model();
if (共通Controller.セッション情報取得(Session, model) == false)
return RedirectToAction("Login", "AccountController");
DateTime dt = DateTime.Today;
model.当日 = 当日 ?? dt;
model.累計開始日 = 累計開始日 ?? dt.AddDays((dt.Day - 1) * -1);
model.累計終了日 = 累計終了日 ??
new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month));
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult 条件設定([Bind(Include = "当日,累計開始日,累計終了日")] 売上入金速報Model model)
{
if (!ModelState.IsValid) return View(model);
return RedirectToAction("結果表示", model);
}
[Authorize]
public ActionResult 結果表示([Bind(Include = "当日,累計開始日,累計終了日")] 売上入金速報Model model)
{
if (共通Controller.セッション情報取得(Session, model) == false)
return RedirectToAction("Login", "AccountController");
model.売上入金速報_Result = 業務DB.売上入金速報(
model.当日, model.累計開始日, model.累計終了日, model.社員番号).ToArray();
return View(model);
}
}
●ビューの作成
検索条件を設定する画面と、検索結果を表示する画面を定義する
1.「ソリューションエクスプローラ」
・「View」フォルダの下の、コントローラ作成時に自動生成された画面名のフォルダ(中身は空)を右クリック
→追加→View
2.「ビューの追加」ウィンドウ
・「ビュー名」なんでも良いが、画面が解りやすい
・「テンプレート」Epty(モデルなし)
・「モデルクラス」「データコンテキストクラス」空白
・「部分ビューとして作成」チェックOFF(デフォルト)
・「レイアウトページの使用」チェックON(デフォルト)
ファイル名は空白のまま
・[追加]ボタンクリック
※この時点で何らかの設定を行って、モデル内の項目を全て表示するような雛形を生成して欲しいのだが、
現時点でやり方不明。
※テンプレート覧で指定できる「List」が近いのだが、ユニークキー項目がないと使用できない。
※カスタム(と言うよりオリジナルの)T4テンプレートを作成すれば、なんとかなる気はするが。。。
3.空のビューが自動生成されるので、条件設定画面/結果表示画面用の処理を追加する
※ビューについては「3.MVC5 ビューでの数値項目右寄せカンマ編集」にて
■インデックス
MVC5データベースファーストでちゃっちゃとモバイルサイト
1.MVC5 データベースファースト テーブル値関数の使用方法
2.MVC5 複数項目あるモデルの定義
3.MVC5 ビューでの数値項目右寄せカンマ編集
4.MVC5 BootStrap でのアコーディオン
5.MVC5 データベースファースト ASP.NET Identity に嵌る
6.MVC5 テーブル値関数の再取り込み方法
7.MVC5 Session情報に配列を記録する方法
8.MVC5 AWS へのアップロード方法
9.SQL Server 読み込み専用ユーザの設定方法
10.MVC5 セッションタイムアウト後にLogin画面に戻す方法
11.自己認証による https化
12.LinQ の遅延実行に泣く