ASP.NET MVC 流れ
View(遅延実行)
@model IEnumerable<MvcBasic.Models.Member>
※コンテキスト:Memberを参照する事を宣言。
コンテキストを通してエンティティクラス(モデル)にアクセスできる
<table class="table">
<tr>
<th>氏名</th>
<th>メールアドレス</th>
<th>誕生日</th>
<th>既婚</th>
<th>備考</th>
</tr>
//1行目の宣言によりModelはエンティティ
@foreach (var item in Model)
{
<tr>
<td>@item.Name</td>
<td>@item.Email</td>
<td>@item.Birth</td>
<td>@item.Married</td>
<td>@item.Memo</td>
</tr>
}
</table>
コントローラー(遅延実行)
(BeginController.cs)
using MvcBasic.Models;
namespace MvcBasic.Controllers
{
※コントローラーはControllerクラスを継承しなければならない
public class BeginController : Controller
{
//コンテキストを使用してモデル(DBエンティティ)をインスタンス化
private MvcBasicContext _db = new MvcBasicContext();
public ActionResult List()
{
//Viewにデータベースを渡す
//この時点ではDBへのアクセスは終了していない。
//Viewからは再度DBへアクセスし、データを取得する。
return View(_db.Members);
}
}
}
コンテキストクラス
(MvcBasicContext.cs)
※エンティティクラスと実際のDBの橋渡し役
using System.Data.Entity;
namespace MvcBasic.Models
{
※コンテキストはDbContextクラスを継承しなければならない
public class MvcBasicContext : DbContext
{
public DbSet<Member> Members { get; set; }
※エンティティクラスを指定
public DbSet<BasketInfo> BasketInfo { get; set; }
※他のエンティティも参照する場合
}
}
接続先DB設定
(Web.Config)
<connectionStrings>
<add name="MvcBasicConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MvcBasic.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
エンティティクラス定義
(Member.cs)
namespace MvcBasic.Models
{
public class Member
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public DateTime Birth { get; set; }
public bool Married { get; set; }
public string Memo { get; set; }
}
}
イニシャライザー
(MvcBasicInitializer.cs)
※初期値を設定
using System.Data.Entity;
namespace MvcBasic.Models
{
public class MvcBasicInitializer : DropCreateDatabaseAlways<MvcBasicContext>
{
【イニシャライザー実行のタイミング指定】
CreateDatabaseIfNotExists : データベースが無い時
DropCreateDatabaseAlways : アプリケーション実行時常に
DropCreateDatabaseIfModelChanges : モデルが変更された時
protected override void Seed(MvcBasicContext context)
{
var members = new List<Member>
{
new Member {
Name = "Name1",
Email = "Email1",
Birth = DateTime.Parse("1980-06-25"),
Married = false,
Memo = "Memo1"
},
new Member {
Name = "Name2",
Email = "Email2",
Birth = DateTime.Parse("1980-06-25"),
Married = false,
Memo = "Memo2"
},
new Member {
Name = "Name3",
Email = "Email3",
Birth = DateTime.Parse("1980-06-25"),
Married = false,
Memo = "Memo3"
}
};
members.ForEach(m => context.Members.Add(m));
context.SaveChanges();
}
}
}
//イニシャライザーの指定
(Global.asax)
using MvcBasic.Models;
using System.Data.Entity;
namespace MvcBasic
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
Database.SetInitializer<MvcBasicContext>(new MvcBasicInitializer());
}
}
}
View(即時実行)
@model IEnumerable<MvcBasic.Models.Member>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
略
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
略
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
</tr>
}
</table>
コントローラー(即時実行)
(BeginController.cs)
using MvcBasic.Models;
namespace MvcBasic.Controllers
{
※コントローラーはControllerクラスを継承しなければならない
public class BeginController : Controller
{
//コンテキストを使用してモデル(DBエンティティ)をインスタンス化
private MvcBasicContext _db = new MvcBasicContext();
public ActionResult Index()
{
//Viewにデータベースをリスト化してから渡す
//この時点でDBへのアクセスが終了しており、Viewからはアクセスしないで済む。
return View(_db.Members.ToList());
}
}
}
属性
モデルに属性を付けると、ViewからのViewヘルパー使用による参照時に様々な機能を利用できる。
・DisplayNameFor()等で項目名を表示
・Display()等で型・データタイプに応じて表示をチェックボックスやリンクに変換
using System.ComponentModel;
namespace MvcBasic.Models
{
public class Member
{
public int Id { get; set; }
[DisplayName("氏名")]
public string Name { get; set; }
[DisplayName("メールアドレス")]
[DataType(DataType.URL)]
public string Email { get; set; }
[DisplayName("結婚")]
public bool Maried { get; set; }
略
}
}
↓