ASP.NET MVC Windowsフォームからのリクエスト

概要

クライアント側がブラウザではなく、Windowsフォームを使用する例

GET

※MVCプロジェクト
namespace MyMVC.Controllers
{
 クライアントからのリクエストを制御
 public class TestController : Controller
 {
  public string Do(string prm)
  {
   ActionResult型でなく、文字列型を返す
   return prm;
  }
 }
}

クライアントからのパラメータの振り分け先設定
namespace MyMVC
{
 public class RouteConfig
 {
  public static void RegisterRoutes(RouteCollection routes)
  {
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{prm}",
    defaults: new { controller = "Test", action = "Do", prm = UrlParameter.Optional }
   );
  }
 }
}

※Windowsフォームプロジェクト
WebRequest作成
var req = WebRequest.Create(@"http://localhost:12345/Test/Do/AAA");
本来はブラウザで指定するURLをWebRequestに設定
(AAAはパラメータ)
WebResponse作成
var res = req.GetResponse();
応答データ受信の為のStreamを取得
Stream st = res.GetResponseStream();
文字コード指定、StreamReader作成
StreamReader sr = new StreamReader(st, Encoding.UTF8);
データ受信
string htmlSource = sr.ReadToEnd();
MessageBox.Show(htmlSource);
→AAA
終了処理
sr.Close();
st.Close();
res.Close();

POST

WebRequestの作成
WebRequest req = WebRequest.Create("http://localhost:12345/Test/Do");
本来はブラウザで指定するURLをWebRequestに設定
POST送信する文字列をバイト型配列に変換
byte[] postDataBytes = Encoding.ASCII.GetBytes("AAA");

メソッドにPOSTを指定
req.Method = "POST";
ContentTypeを"application/x-www-form-urlencoded"に
req.ContentType = "application/x-www-form-urlencoded";
POST送信するデータの長さを指定
req.ContentLength = postDataBytes.Length;
POST送信の為のStreamを取得
Stream reqStream = req.GetRequestStream();
送信するデータ書き込み
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
reqStream.Close();
リクエストメッセージ取得
WebResponse res = req.GetResponse();
↑ 受信データからStreamを取得
Stream resStream = res.GetResponseStream();
読み込み
StreamReader sr = new StreamReader(resStream, Encoding.GetEncoding("shift_jis");
MessageBox.Show(sr.ReadToEnd());
→AAA
終了処理
sr.Close();

※MVCプロジェクト
namespace MyMVC.Controllers
{ 
 クライアントからのリクエストを制御
 public class TestController : Controller
 {
  [HttpPost]
  public string Do()
  {
   Request.InputStream.Position = 0;
   using (StreamReader reader = new StreamReader(Request.InputStream, Encoding.UTF8))
   {
    string output = reader.ReadToEnd();
    ActionResult型でなく、文字列型を返す
    return output;
   }
  }
 }
}

ASP.NET MVC LINQ to Entities

LINQ

統合言語クエリー
Language Integrated Query
データベース、データセット、エンティティ、XML、配列、オブジェクト等、
プログラム内のデータに対する統一されたアクセス方法

LINQ to Entities

EntityDataModelに対するLINQ

実例

※モデル、コンテキストを用意しておく(ASP.NETMVC流れ参照)
private ArticleContext _db = new ArticleContext();

public ActionResult Search(string keyword, bool? released)
{

from句
var articles = from b in _db.Article select b;
var articles = _db.Articles .Select(a => a.Title);

select句
var articles = from b in _db.Article
  select new ArticleView
  {
    Title = b.Title.Substring(0, 10),
    ViewCount = (int)Math.Ceiling(b.ViewCount/ 1000.0),
    Released = (b.Released ? “公開中” : “公開予定”)
  };

別クラス(Model/ArticleView.cs)
public class ArticleView
{
  public string Title { get; set; }
  public int ViewCount { get; set; }
  public string Released { get; set; }
}

//匿名クラスを利用(「匿名クラス」参照)
var articles = from b in _db.Article
  select new
  {
    b.Title.Substring(0, 10),
    b.ViewCount,
    b.Released
  };

var articles = _db.Article
  .Select(b => new ArticleView
  {
    Title = b.Title.Substring(0, 10),
    ViewCount = (int)Math.Ceiling(b.ViewCount/ 1000.0),
    Released = (b.Released ? “公開中” : “公開予定”)
  });

別クラス(Model/ArticleView.cs)
public class ArticleView
{
  public string Title { get; set; }
  public int ViewCount { get; set; }
  public string Released { get; set; }
}

where句
var articles = from b in _db.Article
  where a.Title == "title1"
  selectb;
var articles = _db.Articles
  .Where(a => a.Title == "title1");
  .Select(a=>a.Title);

orderby句
var articles = from b in _db.Article
  orderby b.Published ascending, b.Title descending
  select b;
var articles = _db.Articles
  .OrderBy(b => b.Published)
  .ThenByDescending(b => b.Title);

var articles = _db.Articles
  .OrderByDescending(b => b.Published)
  .ThenBy(b => b.Title);

第一キー
OrderBy(昇順)/OrderByDescending(降順)
第二キー以降
ThenBy(昇順)/ThenDescending(降順)

contain()

//keywordを含むデータを抽出

if (!string.IsNullOrEmpty(keyword) ){
  var articles = from b in _db.Article
    where b.Title.Contains(keyword) select b;
}
if (!string.IsNullOrEmpty(keyword) ){
  articles = articles.Where(a => a.Title.Contains(keyword));
}

==

//true/falseであるデータを抽出

if ( released.HasValue && released.Value) {
  var articles = from b in _db.Article
    where b.release == true select b;
};
if ( released.HasValue && released.Value) {
  articles = articles.Where(a => a.Released);
  articles = articles.Where(a => a.Released == true);
};

Distinct()
var articles = (from a in _db.Article select a.Title).Distinct();
無し

Skip()/Take()
//先頭から5レコードは飛ばす(取得しない)
var articles = (from a in _db.Article select a.Title).Skip(5);
//先頭から5レコードのみ取得する
var articles = (from a in _db.Article select a.Title).Take(5);
//先頭から5レコード飛ばし、6レコード目から5レコードのみ取得する
var articles = (from a in _db.Article select a.Title).Skip(5).Take(5);
無し

First()/FirstOrDefault()
//先頭レコードのみ取得する(~).Take(1)と同じ)
var articles = (from a in _db.Article select a.Title).First();
//先頭レコードのみ取得する。該当データ無しの場合はデフォルト値を取得する
var articles = (from a in _db.Article select a.Title).FirstOrDefault();
無し

group by句
var articles = from a in _db.Article group a by a.Category;

※View
@model IEnumerable<IGrouping<string , ASPNET_MVC_DB.Models.Article>>

<body>
  //elmGrpにはカテゴリーのグループ結果が入る
  @foreach (var elmGrp in Model)
  {
    @elmGrp.Key<br/>

    //elmにはグループ内の要素が入る
    foreach (var elm in elmGrp) {
      @elm.Title<br/>
    }
    <br/>
  }
</body>

⇒結果:
CategoryA
Title1
Title2

CategoryB
Title3
Title4

CategoryC
Title5

グループ結果を絞る場合(Title、ViewCount)
var articles = from a in _db.Article
  group new ArticleView { Title = a.Title, ViewCount = a.ViewCount }
  by a.Category;

複数列でグループ化する場合(Title、ViewCount)
var articles = from a in _db.Article
  group a by new ArticleView { Title = a.Title, ViewCount = a.ViewCount };

別クラス(Model/ArticleView.cs)
public class ArticleView
{
  public string Title { get; set; }
  public int ViewCount { get; set; }
  public string Released { get; set; }
}

var articles = _db.Article.GroupBy(a => a.Category);

※View
@model IEnumerable<IGrouping<string , ASPNET_MVC_DB.Models.Article>>

<body>
  //elmGrpにはカテゴリーのグループ結果が入る
  @foreach (var elmGrp in Model)
  {
    @elmGrp.Key<br/>

    //elmにはグループ内の要素が入る
    foreach (var elm in elmGrp) {
      @elm.Title<br/>
    }
    <br/>
  }
</body>

⇒結果:
CategoryA
Title1
Title2

CategoryB
Title3
Title4

CategoryC
Title5

グループ結果を絞る場合(Title、ViewCount)
var articles = _db.Article
  .GroupBy( a => a.Title , a => new ArticleView { Title = a.Title, ViewCount = a.ViewCount });

複数列でグループ化する場合(Title、ViewCount)
var articles = _db.Article
  .GroupBy( a => new ArticleView { Title = a.Title, ViewCount = a.ViewCount });

別クラス(Model/ArticleView.cs)
public class ArticleView
{
  public string Title { get; set; }
  public int ViewCount { get; set; }
  public string Released { get; set; }
}


  
  return View(articles);
}

ASP.NET MVC ルーティング

グローバルアプリケーションファイル

Global.asax
アプリケーション共通で起動時に実行するイベントを設定
public class MvcApplication : System.Web.HttpApplication
{
  protected void Application_Start()
  {
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    
    //RouteConfig.RegisterRoutes()メソッドを実行する
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    
    BundleConfig.RegisterBundles(BundleTable.Bundles);
  }
}

ルート情報定義

通常アプリケーション起動時に呼び出す。
App_Start/RouteConfig.cs(ASP.NET MVC3以降)
public class RouteConfig
{
  public static void RegisterRoutes(RouteCollection routes)
  {
    routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}/{prm1}/{prm2}",
      // ↑ urlに対するデフォルト値
      defaults: new {
        controller = "Home",
        action = "Index",
        id = UrlParameter.Optional,
        prm1 = "100",
        prm2 = "AAA" }
    );
  }
}

ASP.NET MVC ActionResult

ViewResult

public ActionResult Index()
{
  return View();
}
↓ と同じ
ViewResult vr = new ViewResult();
vr.ViewBag.Msg = "aaa";
return vr;

PartialViewResult

メソッド:PartialView()

RedirectResult

public ActionResult Index()
{
  return Redirect("http://www.~");
  ※return Redirect("~/Next/Index"); も可
}
↓ と同じ
RedirectResult rr = new RedirectResult(url:"http://www.~");
return rr;

RedirectToRouteResult

return RedirectToAction(
  actionName: "Index",
  controllerName: "Next",
  routeValues: new { id = "1", charset = "utf8" }
  );

return RedirectToRoute(
  routeName: "Default",
  routeValues: new {
    contoroller = "Next",
    action = "Index",
    id = "1",
    charset = "utf8"
  }
);

ContentResult

メソッド:Content()

FilePathResult

メソッド:File()

ASP.NET MVC 外部レイアウト/部分ビュー

外部レイアウト

通常のView(レイアウト使用無し)

@{
  Layout = null;
}
<!DOCTYPE html>
<html>
<head>
  <title>Index1</title>
</head>
<body>
  内容
</body>
</html>

※外部レイアウト使用

(Views/Index.cshtml)
@{
  //レイアウトファイル名は「_」で開始されている事
  Layout = "~/Views/Shared/_Layout.cshtml";
}
内容…①

レイアウトを使用するとViewに<html>や<body>タグが表示されない。
レイアウトファイルに記載されたタグが使用される。
この場合、Viewでの編集領域は、↓ レイアウトファイルにおける@RenderBody部分に格納される。

※レイアウトファイル
(Views/Shared/_Layout.cshtml)
<!DOCTYPE html>
<html>
<head>
  <title>@ViewBag.Title</title>
  <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
</head>
<body>
  @RenderBody() …①の内容はここに表示される
</body>
</html>

部分ビュー

↓ View(レイアウト使用でも不使用でも可)
//部分ビューの読み込み
@Html.Partial(partialViewName:"_Layout")
⇒外部ファイルが↑ 部分に読み込まれる。

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属性

ASP.NET MVC 検証処理

検証結果判定(Controller)

public ActionResult Create(FormCollection collection)
{
  TEST.Models.MyDBEntities myDb = new TEST.Models.MyDBEntities();
  
  //modelの新規作成
  TEST.Models.MyTable1 model = new TEST.Models.MyTable1();
  
  return View(model);
}

[HttpPost]
public ActionResult Create(TEST.Models.MyTable1 model)
{
  //検証結果を判定
  if (ModelState.IsValid)
  {
    TEST.Models.MyDBEntities myDB = new TEST.Models.MyDBEntities();
    //myDB.AddToMyTable1(myTable1: model);
    
    myDB.AddObject(entitySetName: “MyTable1”, entity: model);
    myDB.SaveChanges();
    
    RedirectToAction(“Create”);
  }
  
  return View(model);
}

検証ルール(Model)

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

入力エラー時に表示されるコントロール名
[DisplayName(“Field1”)]
例:Field1は必須です。
未入力検証
[Required(ErrorMessage = “{0}は必須です。”)]
例:(DisplayName)は必須です。
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
[RegularExpression(“[0-9]”, ErrorMessage = “{0}は数値を入力してください。”)]
public int Field1 { get; set;}

検証結果の表示(View)

jQueryライブラリ参照
<script src=”@Url.Content(“~/Scripts/jquery.validate.min.js”)” type=”text/javascript”></script>
<script src=”@Url.Content(“~/Scripts/jquery.validate.unobtrusive.min.js”)” type=”text/javascript”></script>
@using (Html.BeginForm())
{
  @Html.ValidationSummary(excludePropertyErrors:true)
  excludePropertyErrors:true ⇒ 入力エラー内容をまとめて表示させない
  (Html.ValidationMessage等による個別のエラー表示が必要)
  excludePropertyErrors:false ⇒ 入力エラー内容がまとめて表示される
  (Html.ValidationMessage等による個別のエラー表示が不要。またはメッセージを「*」等に)
  

  <div>
    <div>
      @Html.EditorFor(model => model.Field1)<br />
      @Html.ValidationMessageFor(model => model.Field1)<br />

      //excludePropertyErrors:false時の設定(エラーメッセージを「*」に)
      @Html.ValidationMessageFor(model => model.Field1, validationMessage:”*”)<br />

    </div>
    
    <div>
      @Html.EditorFor(model => model.Field2)<br />
      @Html.ValidationMessageFor(model => model.Field2)<br />
    </div>
    
    <div>
      @Html.EditorFor(model => model.Field3)<br />
      @Html.ValidationMessageFor(model => model.Field3)<br />
    </div>
    
    <input type=”submit” value=”Create” /><br />
  </div>
}

検証結果の装飾(CSS)

Content/Site.cssに記載する。

/* Styles for validation helpers
———————————————————–*/
.field-validation-error
{
  color: #ff0000;
}
.field-validation-valid
{
  display: none;
}
.input-validation-error
{
  border: 1px solid #ff0000;
  background-color: #ffeeee;
}
.validation-summary-errors
{
  font-weight: bold;
  color: #ff0000;
}
.validation-summary-valid
{
  display: none;
}

ASP.NET MVC DB操作

ASP.NET MVC CRUD処理

スキャフォールディング

Scaffolding:足場作り
CRUD(Create/Read/Upadate/Delete) :追加、読込、変更、削除に関するView、コントローラーを自動作成する

Select

public class ScaffoldingController : Controller
{
  private ContextMember _db = new ContextMember();
  
  public ActionResult Index()
  {
    return View(_db.MemberDB.ToList());
  }
  
  public ActionResult Details(int? id)
  {
    if (id == null)
    {
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Member member = _db.MemberDB.Find(id);
    if (member == null)
    {
      return HttpNotFound();
    }
    return View(member);
  }
}

TEST.Models.MyDBEntities myDb = new TEST.Models.MyDBEntities();
var model1 = from m in myDb.MyTable1 select m;
var model2 = from m in myDb.MyTable1 where m.Field1 == 3 select m;

Insert

public class ScaffoldingController : Controller
{
  [HttpPost]
  public ActionResult Create([Bind(Include=
"Id,Name,Email,Birth,Married,Memo")]
Member member)
  {

    ※バインド機能:Includeで指定したパラメーター以外をViewから渡せない。
     必須ではないが過多ポスティング攻撃を防止できる。
    
    

    if (ModelState.IsValid)
    {
      db.MemberDB.Add(member);
      db.SaveChanges();
      return RedirectToAction("Index");
    }
    return View(member);
  }
}

TEST.Models.MyDBEntities myDb = new TEST.Models.MyDBEntities();

//modelの新規作成
TEST.Models.MyTable1 model = new TEST.Models.MyTable1();
model.Field1 = 4;
model.Field2 = “d”;
model.Field3 = “ddd”;
//Insert処理
myDb.AddObject(entitySetName: “MyTable1”, entity: model);
myDb.AddToMyTable1(myTable1: model);
※自動生成されるメソッド(中で↑AddObject()を呼び出す)
//保存
myDb.SaveChanges();

Delete

TEST.Models.MyDBEntities myDb = new TEST.Models.MyDBEntities();
//指定したidでレコードを抽出
var model = myDb.MyTable1.Where(m => m.Field1 == id).Single();
//削除
myDb.DeleteObject(entity: model);
//保存
myDb.SaveChanges();

Update

TEST.Models.MyDBEntities myDb = new TEST.Models.MyDBEntities();
//指定したidでレコードを抽出
var model = myDb.MyTable1.Where(m => m.Field1 == id).Single();
//変更する内容を設定
model.Field2 = “D”;
model.Field3 = “DDD”;
//保存
myDb.SaveChanges();

ASP.NET MVC EntityDataModel

設定方法

実際のデータベースのDB、テーブル、フィールド等をプログラムから操作できる状態のオブジェクト(エンティティ)として構築する。
aspnetmvc_entitymodel

「Model」フォルダ右クリックメニューから「新規追加
 ↓
データ項目内の「EntityDataModel」を選択
 ↓
既存データベースから生成
 ↓
既存データベースのサーバー、DB名、テーブル等を選択

DB名、テーブル名、フィールド名等が全く同じエンティティが自動で作成される
EDM2

実在のデータベース内テーブルと同じ
EDM4

実際にはModelにクラスが(自動で)作成されている。
EDM3

Controller : エンティティ(クラス)のインスタンス作成

①1レコードのみ渡す場合
public ActionResult MyTable1_1Row()
{
  //ModelsにあるMyDBEntitiesクラスのインスタンスを作成
  TEST.Models.MyDBEntities MyDB = new TEST.Models.MyDBEntities();
  var mymodel = MyDB.MyTable1;
  //View(MyTable1_1Row)にmodelデータの1レコード目を渡す
  return View(model: mymodel.First());
}

②テーブルごと渡す場合
public ActionResult MyTable1()
{
  //ModelsにあるMyDBEntitiesクラスのインスタンスを作成
  TEST.Models.MyDBEntities MyDB = new TEST.Models.MyDBEntities();
  var mymodel = MyDB.MyTable1;
  //View(MyTable1)にmodelデータを渡す
  return View(model: mymodel);
}
③DBごと渡す場合
public ActionResult MyDB()
{
  //ModelsにあるMyDBEntitiesクラスのインスタンスを作成
  TEST.Models.MyDBEntities MyDB = new TEST.Models.MyDBEntities();
  return View(model: MyDB);
}

View : モデルデータの取得

【MyTable1_1Row.cshtml】
@model TEST.Models.MyTable1
<!DOCTYPE html>
<html>
<head>~</head>
<body>
  //モデルデータを出力
  @Model.Field1<br/>
  @Model.Field2<br/>
  @Model.Field3<br/>
</body>
</html>

【MyTable1.cshtml】
@model IEnumerable<TEST.Models.MyTable1>
<!DOCTYPE html>
<html>
<head>~</head>
<body>
  //モデルデータを全件Loop
  @foreach (var item in Model)
  {
    @item.Field1 @item.Field2 @item.Field3<br/>
  }
</body>
</html>

【MyDB.cshtml】
@model TEST.Models.MyDBEntities
<!DOCTYPE html>
<html>
<head>~</head>
<body>
  @foreach (var elm in Model.MyTable1)
  {
    @elm.Field1 @elm.Field2 @elm.Field3<br />
  }
  <br />
  @foreach (var elm in Model.MyTable2)
  {
    @elm.Field1 @elm.Field2 @elm.Field3<br />
  }
</body>
</html>

ASP.NET MVC HTMLヘルパー

Modelと関連付けられるヘルパー(For系)

@Html.Displar(model => model.Name);
等、実在のモデルクラスが参照され、自動的に初期値が与えられる。

type属性

※html5対応:Type属性に応じて自動で入力が規制される最適な<input>要素を生成する。
例:
@Html.EditorFor(~ type="search"; />
<input~ type="search" >
@Html.EditorFor(~ type="email"; />⇒検索テキスト
@Html.EditorFor(~ type="url"; />⇒メールアドレス
@Html.EditorFor(~ type="tel"; />⇒電話番号
@Html.EditorFor(~ type="number"; />⇒数値
@Html.EditorFor(~ type="date"; />⇒日付
@Html.EditorFor(~ type="datetime"; />⇒世界標準日時
@Html.EditorFor(~ type="datetime-local"; />⇒ローカル日時
@Html.EditorFor(~ type="month"; />⇒月
@Html.EditorFor(~ type="week"; />⇒週
@Html.EditorFor(~ type="time"; />⇒時刻
@Html.EditorFor(~ type="range"; />⇒数値範囲(スライダー)
@Html.EditorFor(~ type="color"; />⇒色

@Html.EditorFor()

@Html.EditorFor(model => model.Field1)
⇒<input
  data-val=~ data-val-number=~ 等DBに応じた属性
  id="Field1" name="Field1" type="text" value="0" />

@Html.LabelFor()

@Html.LabelFor(model => model.Field1)
⇒<label for="Field1">Field1</label>

@Html.DisplayFor()

※モデル属性に応じて最適なhtmlを生成する。
※Model:name
public bool name { get; set; };
⇒チェックボックス
[DataType(DataType.URL)]
public string name { get; set; };
⇒ハイパーリンク
@Html.DisplayFor(model => model.Field1)

Field1

@Html.DisplayNameFor()

コンテキストのDisplayName属性を表示する
@Html.DisplayNameFor(model => model.Field1)

設定名
public class MyModel
  {
    [DisplayName(“設定名”)]
    public string Field1 { get; set; }
  }

Modelと関連付けられないヘルパー

Modelと関連付けない、初期値を与えない場合に使用。

@Html.Display()

※モデル属性に応じて最適なhtmlを生成する。
※Model:name
public bool name { get; set; };
⇒チェックボックス
[DataType(DataType.URL)]
public string name { get; set; };
⇒ハイパーリンク
@Html.Display(expression: "name")

name

@Html.TextBox()

@Html.TextBox(name:"txtTest",value:"aaa")

<input id="txtTest" name="txtTest" type="text" value="aaa" />

@Html.Editor()

@Html.Editor("name")

<input class="text-box single-line" id="name" name="name" type="text" value="" />

@Html.CheckBox()

@Html.CheckBox(name:"chkTest",isChecked:true)
@Html.CheckBox(name:"chkTest", isChecked: false)

<input checked="checked" id="chkTest" name="chkTest" type="checkbox" value="true" />
<input name="chkTest" type="hidden" value="false" />
<input id="chkTest" name="chkTest" type="checkbox" value="true" />
<input name="chkTest" type="hidden" value="false" />

@Html.RadioButton

@Html.RadioButton(name:"rdoTest", value:true)
@Html.RadioButton(name:"rdoTest", value: false)

<input id="rdoTest" name="rdoTest" type="radio" value="True" />
<input id="rdoTest" name="rdoTest" type="radio" value="False" />

@Html.Label()

@Html.Label(expression: "name")

<label for="name">name</label>

@Html.DropDownList()

@{
  Dictionary<int, string> myDic = new Dictionary<int, string>
  {
    {3,"長嶋"},
    {1,"王"},
    {18,"堀内"}
  };
  
  SelectList mySelectList1 = new SelectList(items: myDic);
}
@Html.DropDownList(name: "name", selectList: mySelectList1)

<select id="name" name="name">
  <option>[3, 長嶋]</option>
  <option>[1, 王]</option>
  <option>[18, 堀内]</option>
</select>

@{
  List<int> myList = new List<int> { 1, 2, 3, 4, 5 };
  SelectList mySelectList2 = new SelectList(items: myList);
}
@Html.DropDownList(name: "name", selectList: mySelectList2)

<select id="name" name="name">
  <option>1</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  <option>5</option>
</select>

@Html.ListBox()

@Html.ListBox(name:"name",selectList:mySelectList1)

<select id="name" multiple="multiple" name="name">
  <option>[3, 長嶋]</option>
  <option>[1, 王]</option>
  <option>[18, 堀内]</option>
</select>
@Html.ListBox(name:"name",selectList:mySelectList2)

<select id="name" multiple="multiple" name="name">
  <option>1</option>
  <option>2</option>
  <option>3</option>
  <option>4</option>
  <option>5</option>
</select>

@Html.Password()

@Html.Password(name: "name")

<input id="name" name="name" type="password" />

Form関連

@Html.BeginForm()

@using (Html.BeginForm()){~}

<form action="/~/~" method="post">
 ~
</form>
↓の書き方も可
@Html.BeginForm()
 ~
@Html.EndForm()

@using(Html.BeginForm(
  actionName: "Index",
  controllerName: "Next",
  routeValues: new { id = "5", charset = "utf8" }, ※
  method: FormMethod.Post,
  htmlAttributes: new { tabindex = "1" }))
{
  <input type="submit" value="送信"/>
}

<form action="/Next/Index/5?charset=utf8" method="post" tabindex="1">
  <input type="submit" value="送信"/>
</form>
※複数のパラメーターをサーバーに渡す場合は匿名クラス(「「LINQtoEntity」参照」を利用する。

@Html.Hidden()

@Html.Hidden(name: "name",value:"aaa")

<input id="name" name="name" type="hidden" value="aaa" />

リンク/エンコード関連

@Html.ActionLink()

@Html.ActionLink(linkText: "次ページ", actionName: "Next")

<a href="/Test/Next">次ページ</a>
@Html.ActionLink(
  linkText: "次ページ",
  actionName: "Index",
  controllerName: "Next",
  protocol: "https",
  hostName: "www.~",
  fragment: "memo",
  routeValues: new { id = "5", charset = "utf8" },
  htmlAttributes: new { tabindex = 1 }
)
⇒<a href="https://www.~/Next/Index/5?charset=utf8#memo" tabindex="1">次ページ</a>

@Html.RouteLink()

※@Html.ActionLinkとほぼ同じ
@Html.RouteLink(
  linkText: "次ページ",
  routeValues: new {
    Controller = "Next",
    Action = "Index",
    id = "5",
    charset = "utf8"
  },
  htmlAttributes: new { tabindex = 1 }
)
⇒<a href="/Next/Index/5?charset=utf8" tabindex="1">次ページ</a>

その他

@Html.ValidationSummary()

@Html.ValidationSummary(excludePropertyErrors: true)
⇒無し

@Html.ValidationMessageFor()

@Html.ValidationMessageFor(model => model.Field1, validationMessage: "*")
⇒<span
  data-valmsg-for="Field1"
  data-valmsg-replace="false">*</span>

@Html.Encode()

@Html.Encode(value: "<")

&lt;
@Html.Encode(value: ">")

&gt;