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; }
    
    略
  }
}

mvc_通常model
 ↓
mvc_displayname属性