ビューに渡すデータやリストは一つだけの場合が多いと思いますが、では複数渡したい時はどうすればいいでしょうか?
表示だけの場合はTupleを利用して複数のデータを持たせればよいです。
foreach文とかを利用したい時はToListメソッドを利用してList型をTupleに持たせるとよいです。
でも、Tupleではダメな時があります。
それは、Razor構文でのHtml.TextBoxFor等を使うときは、そのビューに渡したいデータをプロパティで保持するクラスを作って、それをビューに渡すとよい。
Tupleの場合
Tupleクラスを使う場合は、データを渡すコントローラ側で変数にvarを使わずに、型を明記した方がエラーがあった時にわかりやすいと思います。
また、ビュー側でforeach文を使いたい場合には、データをToList()メソッドでListクラスにした方がいいです。
ビュー側ではModelがnullのことがある場合があるので、if文でModelがnullでないことを調べたほうがよいです。
コントローラー側
//データの取得
var data1 = db.Table1.ToList<Models.class1>();
var data2 = db.Table2.ToList<Models.class2>();
//タプルにしてデータを渡すための変数
//型は明記したほうがいいのかなと自分では思います。
//その方がエラーがあった時に確認がしやすいかと。
Tuple<list<Models.class1>, List<Models.class2>> myModel = new Tuple<list<Models.class1>, List<Models.class2>>(myData1, myData2);
return View(myModel);
ビュー側
@model Tuple<List<Models.class1>, List<Models.class2>>
//Tupleがnullの可能性もあるのでの予防処理
@if(Model != null)
{
<table>
<tr><th>列1</th><th>列2</th><th>列3</th></tr>
@if (Model.Item2.Count > 0)
{
foreach (var item in Model.Item2)
{
<tr>
<td>@item.列1</td>
<td>@item.列2</td>
<td>@item.列3</td>
</tr>
}
}
</table>
}
まとめるクラスを使う場合
コントローラからビューに渡したいデータが複数あり、またHtml.TextBoxForなどのヘルパーを使いたい時には、ラッパーとなるクラスを自分で作り、そのプロパティにデータを持たせるとやりやすいです。
モデルフォルダの自作のクラス
public class myDataClass
{
public Models.class1 data1
{
get;
set;
}
public Models.class2 data2
{
get;
set;
}
}
コントロール側
Models.myDataClass myData = new Models.myDataClass
{
data1 = new Models.class1(),
data2 = new Models.class2()
};
return View(myData);
ビュー側
@model Models.myDataClass
