SlideShare a Scribd company logo
はじめての
ASP.NET MVC 5
About me
• Tomo Mizoe
• CEO & Founder of July Inc.
• http://www.july.co.jp
• Twitter: @tmizoe
• Microsoft Certified Trainer
• Microsoft Certified Solution Developer
• Windows Store Apps using HTML5 and JavaScript
• Web Applications
参考
• Getting Started with ASP.NET MVC 5
• Scott Guthrie (twitter @scottgu ),
Scott Hanselman (twitter: @shanselman ),
Rick Anderson (twitter: @RickAndMSFT )
http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started
ASP.NET MVC の特徴
• MVC
• C#
• 統合環境Visual Studio
• コード補完
• 文法チェック
• Facebook、Twitter、Office 365 など各種認証の
モジュール導入も簡単
• Single Page Applicationにも対応(AngularJS 等)
• デプロイ
• Azureへクリック1回
• Azureだからスケールアップもクリック2-3回
用意するもの
• Windows OS
• Visual Studio 2013 Express for Web (無償)
有償版でも、もちろんOK
新プロジェクト作成
• ファイル ⇒ 新しいプロジェクト
インストール済み:Visual C#:ASP.NET Webアプリケーション
名前「MvcMovie」
テンプレート「MVC」
Windows Azure「クラウド内のホスト:オフ」
新しいプロジェクトの完成
まだ何もしてないけどコンパイルして実行してみる
• デバッグ⇒デバッグ開始
• または F5
何もしてないけどレスポンシブ スマホは
メニューを
たたむ
PCは3カラム
タブレットとスマホは
1カラム
コントローラ追加
• コントローラ:処理の振り分け担当
• ソリューションエクスプローラ⇒(プロジェクト名)
⇒ Controllersフォルダ右クリック⇒追加
⇒コントローラー
• MVC 5 コントローラ⇒追加
コントローラ追加
コントローラ追加
• コントローラ名:HelloworldController
追加されたもの
• Controllers
• HelloworldController.cs
• Views
• Helloworldフォルダ
コントローラ追加
HelloworldController.cs編集
デバッグ実行
• F5キーまたは
デバッグ⇒
デバッグ開始
• ブラウザでURL指定
• http://localhost:55880/Helloworld/
• http://localhost:55880/Helloworld/Welcome
※ 55880の部分はポート番号。実行タイミングやIISの設定で
異なります
ルーティング
• どのコントローラーを呼び出すか指定
• どのメソッドを呼び出すか指定
• 引数の処理
• App_Start / RouteConfig.cs
ルーティング
defaults: new { controller = "Helloworld",
action = "Welcome", id = UrlParameter.Optional }
デフォルトのコントローラとアクションを変更
controller = “Helloworld”,
action = “Welcome”
パラメータ
• HelloworldController.cs の Welcomeアクションを編集
デフォルト値の
指定もできるよ
http://サーバ名/?name=文字列&numTimes=整数
HttpUtility.HtmlEncode
特殊文字等を使った攻撃を無効化
パラメータに変な値が入ったらどうなる?
• 試しにやってみよう
http://サーバ名/?numTimes=2.3
http://サーバ名/?numTimes=5%
http://サーバ名/?numTimes=“8”
• コントローラ・アクションの大文字小文字は?
/helloWORLD/welCOMe/?name=aaa
アクション追加
HelloworldController.csにLoginアクション追加
アクセスしてみる
/helloworld/login/?id=3&name=Taro
/helloworld/login/4?name=Jiro
なぜ 「id=」を省略できたか
• App_Start / RouteConfig.cs
ここまででやったこと
• コントローラでHTMLをreturn(View Controller)
• まぁ、難しくない。
• でも、HTMLが複雑になると大変になるよね?
• そんなあなたに! View です
View作成
• 作業内容:HelloWorldControllerに
Viewテンプレートを適用
• Razor view engine
• 拡張子 .cshtml
• C#でHTMLを生成
• テンプレート作成時のキータイピングを最小化
• 効率よくコーディング
ControllerがViewオブジェクトをreturnするよう
に変更
public ActionResult Index()
{
return View();
}
テンプレートを使うように、Viewに指令する。
コントローラのメソッド(=アクションメソッド)は
多くの場合、ActionResult(またはそれを継承したクラス)を
returnする。
View追加
• Views / HelloWorld 右クリック⇒追加
⇒レイアウトを使用するMVC 5ビューページ(Razor)
項目名とレイアウトページ
• 項目名:Index
• レイアウトページの選択:_Layout.cshtml
• Shared選択
• OK
確認
• Views / HelloWorld / Index.cshtml
が追加されている
コード追加
確認
• Index.cshtml右クリック
⇒ブラウザーで表示
タイトル、トップのリンクを変更
「アプリケーション名」「ホーム」「詳細」のところ
Shared / _Layout.cshtmlを開く
• すべてのページで共有
• 「レイアウトページ」と呼ぶ
レイアウトページ編集
レイアウトページ確認
• Views/HelloWorld/Index.cshtml
に次の記述があるのでレイアウトページが呼ばれる
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Index.cshtmlを編集
@{
ViewBag.Title = “My Movie List";
}
<h2>Movie List</h2>
<p>Hello from View テンプレート!</p>
ページタイトル
<head><title>
レイアウトページの
@ViewBag.Titleで読み
込まれる
ViewBagにはパラメー
タを自由に含めること
ができる
この段階でできたこと
• 固定のデータ「Hello from View テンプレート!」
をViewに設定し、表示させる
• 次は:
• データを可変にしたい。
データベースに保存されたデータを表示させたい。
• ⇒Modelをつくります
データの流れ
• Model ⇒ Controller ⇒ View
• Viewでは処理を実行したり、データを作成しない。
• 処理ロジックはControllerへ
• データはModelからもらったものをそのまま使う
HelloWorldController.cs の Welcomeアクション変更
Viewに対してViewBagオブジェクトでデータを渡す。
このデータはURIで受け取った、ユーザからのパラメータとします。
ViewBagはダイナミックオブジェクトで、なんでも入れることが可能。
この時点でのHelloWorldController.cs
ソリューションをビルドしておく
• ソリューションを右クリック
⇒ソリューションのビルド
View追加
Views/HelloWorldを右クリック
⇒追加⇒レイアウトを使用するMVC5ビューページ(Razor)
View追加
• 項目名:Welcome
• レイアウトページの選択:_Layout.cshtml
• Shared選択
• OK
Welcome.cshtml
• ViewBagで受け取ったMessageをNumTimes個
表示させる
動作確認
http://localhost:x/HelloWorld/Welcome?name=Taro&numtimes=4
モデルバインダにより、
URIから取得したデータを
Controllerが受け取り、
ViewBag経由でViewに渡す。
ViewBag の代わりに「View Model」を使う方法もある。後述。
Model
• データベースとの接続部分
• Entity Framework (EF) による Code First 手法
• シンプルなクラスによるModel定義
( POCO クラス "plain-old CLR objects")
• クラスを定義 = データベースのテーブル作成
• Database First 手法もあります
http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview
(by Tom Fizmakens)
迅速な開発
Model追加してみよう
• Models⇒追加⇒クラス
• クラス名
Movie
ModelにクラスMovie追加
• 映画のタイトル等を管理するデータベース
• Movieオブジェクトのインスタンス
= データベースのレコード
• Movieオブジェクトのプロパティ
= データベースのカラム
Modelにクラス MovieDBContext 追加
Entity Framework
MovieDBContextクラスの役割
• Entity Frameworkの基底クラスDbContextを継承
• データベースに接続して:
• 検索
• 保存
• 更新
• 削除
• DbContextとDbSetの参照のためにはファイル上
部で「using System.Data.Entity;」が必要。
Note: 未使用のusingの削除
• ファイル右クリック
⇒usingの整理
⇒未使用のusingの削除
ここまでのおさらい
• ついにModelも追加
• MVCのすべてが登場
• Model
• View
• Controller
• 次は、データベースと接続していきます
SQL Server LocalDBとの接続
• MovieDBContextクラスは、Movieオブジェクトを
データベースのレコードにマッピングする
• では、どのデータベースに接続するか?
• まだデータベースの設定はしていないはず…?
• Entity Frameworkのデフォルト設定ではLocalDBを
使います
• 設定はアプリケーションのWeb.configファイルで
SQL Server Express LocalDB
• LocalDB
• SQL Server Express の軽量版
• .mdfファイルをデータベースとして取り扱う
• 通常、プロジェクトのApp_Dataフォルダに保存
• リリース時には使わないほうが良い
⇒Webサーバと一緒に使うことを想定していないから
• ただしLocalDBからの変換は簡単
• SQL Server
• SQL Azure
• Visual Studio 2013と一緒にLocalDBがインストールされ
ます(2012でも)
• Entity Frameworkは最初に、オブジェクトのコンテキス
トクラスと同じ名前の接続文字列を探します。
(今の場合は MovieDBContext)
接続文字列の確認
• Web.configを開く
• <connectionStrings>を探す
MovieDBContextの接続文字列を追加
<add name="MovieDBContext"
connectionString="Data Source=(LocalDB)v11.0;
AttachDbFilename=|DataDirectory|Movies.mdf;
Integrated Security=True"
providerName="System.Data.SqlClient"/>
新規プロジェクトに入っている「<add name=“DefaultConnection”」の部分と
ほとんど同じです。コピペしてから編集すると便利
DefaultConnectionはユーザのアクセス権を担当
会員ページの作成はここではやりません。下記を参照
http://www.windowsazure.com/en-us/develop/net/tutorials/web-site-with-sql-database/
Modelと接続文字列
• 接続文字列のNameと
DbContextクラスの
名前は一致させる
• .mdfファイルの名前
はご自由に
ControllerからModelのデータにアクセス
• MoviesControllerクラスを新規作成
• 映画のデータを取り出す
• 映画の一覧をViewテンプレートでブラウザに表示させる
• 作業の前にビルドしておいてください
ビルドしないとエラーが出るかも
Controller追加
• Controller右クリック⇒追加⇒コントローラ-
• 「Entity Frameworkを使用した、ビューがある
MVC5コントローラー」⇒追加
• MoviesController
⇒追加
Controller追加
プルダウンから選ぶ
• モデルクラス: Movie(MvcMovie.Models)
• データコンテキストクラス:
MovieDBContext(MvcMovie.Models)
※追加ボタンでエラーになる場合は、ビルドしてください
この操作でできたファイル
• Controllers/MoviesController.cs
• Views/Moviesフォルダ
• Create.cshtml
• Delete.cshtml
• Details.cshtml
• Edit.cshtml
• Index.cshtml
• 自動的にCRUD(Create, Read, Update, Delete)アク
ションメソッドと、Viewが作られる
• 映画データの作成、一覧表示、編集、削除が
できるようになった! ありがとう!
動作確認
• Views/Index.cshtml
右クリック
⇒ブラウザで表示
ルーティング設定
• App_Start/RouteConfig.cs
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Movies",
action = "Index",
id = UrlParameter.Optional }
);
http://localhost:xx/でアクセス可能に
新しいデータを作成
• IndexページでCreate Newを押す
• 適当なデータを入力してみる
• わざと変な値を入れてみる
Release Date: today
Price: -9,999
• 入力したらEdit, Details, Deleteも動作確認
MoviesController.csに自動生成されたコードを確認
• 先頭部分 データベースからの
Movieコンテキスト
DBのMoviesテーブルはそのまま
すべてViewに転送
厳密な型指定のModelとキーワード@model
• このチュートリアルの最初のほうでViewBagを紹介しま
した。データやオブジェクトを転送する。これは遅延バ
インディングによるダイナミックオブジェクト。
• これに対し、厳密に型指定してViewテンプレートにオブ
ジェクトを渡すこともできます。
⇒ コンパイル時のチェックと、Visual Studioの
IntelliSenceによるコードチェックを便利に利用できる
• 今回のスキャフォールディング機能は厳密な型指定によ
るMoviesControllerクラスとViewテンプレートを作成
• 次に、自動生成のDetailsメソッドを確認してみよう
自動生成のDetailsメソッド
• パラメータ「id」は基本としてルートデータから獲得
• 例)http://localhost:xx/movies/details/1
• コントローラ:Movies
• アクション:Details
• ID: 1
• http://localhost:xx/movies/details?1でも同じ
MovieがみつかったらViewに渡す
Views/Movies/Details.cshtml
@model によって、この
Viewが参照すべき型を指定
後述のため略
Modelのタイトルのカラム名
ViewBagも一緒に使える
Views/Movie/Index.cshtml
item: 厳密な型指定
Ienumerable<Movie>
オブジェクト
型指定のおかげで
foreachできる
型指定のおかげで
IntelliSenceが効く
SQL Server LocalDB
• Entity FrameworkのCode Firstは、指定されたMoviesの
データベースがなければ自動的に生成
• App_DataフォルダにMovies.mdfが保存される
• ソリューションエクスプローラで見えないとき:
「すべてのファイルを表示」をオン
「最新の情報に更新」を押す
サーバーエクスプローラー
• Movies.mdfをダブルクリック
• テーブルフォルダを開いて確認
• IDは鍵アイコン⇒プライマリキー
• 参考:「 Getting Started with
Entity Framework 6 Code First
using MVC 5」
http://www.asp.net/mvc/tutorials/getting-started-
with-ef-using-mvc/creating-an-entity-framework-
data-model-for-an-asp-net-mvc-application
テーブルデータの表示
• Moviesテーブルを右クリック
⇒テーブルデータの表示
• 入力したレコードが確認できる
テーブル定義を開く
• Moviesテーブルを右クリック
⇒テーブル定義を開く
• テーブルの構造を確認
• MoviesテーブルとMoviesクラスが結合されている
• Entity Frameworkによる自動生成のスキーマによる
切断
• 確認が終わったらMovieDBContextを右クリック⇒切断
• 切断しておかないと、次のプロジェクト実行時にエ
ラーになる
• 次のトピック
• スキャフォールディングの残りのコード
• 検索インデックス
EditメソッドとEdit View
• Editアクションメソッドの詳細を確認
• その前に:Release Dateを調整します
• Models/Movie.csを開く
• ハイライト部分を追加
Display(Name=“リリース日”)
動作確認
• ビルドして一覧からEditを選択
⇒URIを確認: /Movies/Edit/1
• Views/Movies/Index.cshtmlのActionLinkメソッドで
URIを生成している
@Html.ActionLink("Edit", "Edit", new { id=item.ID })
• リンク文字を日本語にするには:
@Html.ActionLink(“編集", "Edit", new { id=item.ID })
• 価格を DataType.Currency にしてみよう
ActionLinkメソッド
• Htmlオブジェクト:System.Web.Mvc.WebViewPageを
継承するヘルパー
• ヘルパーのActionLinkメソッドはControllerアクションメ
ソッドへのHTMLリンクを動的に生成
• 引数1:表示される文字(例:<a>編集</a>)
• 引数2:アクションメソッド(例:Editアクション)
• 引数3:ルーティングのための匿名オブジェクト(例:ID)
• 結果としてURIは http://localhost:xx/Movies/Edit/4のよ
うになる。参考:App_Start/RouteConfig.cs
• 課題:Create New, Details, Deleteも日本語にしてみよう
パラメータの指定方法
• http://localhost:xx/movies/edit?id=2
でも指定できる
POSTの場合
・Bind属性による攻撃の無効化
・受け取るデータの選択(今回はすべて)
Editアクションメソッドが2つある。
こっちはGETの場合
ValidateAntiForgeryToken
リクエスト偽装のためのトークン発行
Views/Movies/Edit.cshtml も参照
Html.ValidateAntiForgeryToken()
• クロスサイトスクリプティング(XSRF, CSRF)攻撃対策
• type=hiddenのinput要素を生成し、トークンを埋め込む
• Movies ControllerのEditメソッドと一致していなければ
先に進めない
HttpGetメソッド
• MovieのIDを取得
• Entity FrameworkのFindメソッドでDBのレコード検索
• 見つからないときは HttpNotFoundを返す
• スキャフォールディングのとき:
• Viewに<label>と<input>要素も一緒に作る
HTMLヘルパー
• Html.LabelFor
フィールド名(Title, ReleaseDate, Genre, Price)を出力
• Html.EditFor
<input>を出力
• Html.ValidationMessageFor
バリデーションメッセージ
• /Movies/Edit/id にアクセスしてHTMLソースを確認
/Movies/EditにPOSTデータが渡ったとき
• Saveボタンが押されると<form>から/Movies/Editを呼ぶ
モデルバインダがPOST
データを取得し、Movie
オブジェクトを作成
取得したデータがMovieオブ
ジェクトの編集・更新に利用で
きるかどうかチェック
DBに保存
保存後Indexに戻り、
Movieの一覧を表示。
いま保存したばかりの
データも一緒に表示する。
/Views/Movies/Edit.cshtml のバリデーション
• Html.ValidationMessageForヘルパーによる
エラーメッセージ
POSTとGET
• HttpGetの場合
• Movieオブジェクト(Indexの場合はオブジェクトのリスト)を
Modelから取得する
Modelに変更を加える場合(作成、編集、削除)はPOSTを使う
(セキュリティのためと、RESTパターンのため)
検索機能
• ジャンルや名前で検索できるようにしよう
• MoviesController の Indexアクションを編集
• movies: DBから検索するためのLINQクエリ
• searchString が存在するときはクエリを変更
• 「s=>s.Title」というのはラムダ表現
• Contains は SQL の Like にマップされる
• /movies/index?searchString=検索語
検索機能のためのルーティング調整
• /App_Start/RouteConfig.cs の設定
{Controller}/{action}/{id}
• {id}でstringも受け付けるように調整
• /movies/index/検索語
検索ボックス
• URLで指定するのも大変なので元に戻します
• /Views/Movies/Index.cshtml を編集
@Html.ActionLink(“新規作成”, “Create”) のすぐ下
検索ボックス
• Html.BeginForm ヘルパー
• <form>タグを作成
• 検索ボタンを押したら、自分自身にPOST
• 検索するだけでデータの変更はない ⇒GETで良いので、
HttpPostをオーバーロードする必要はない
• しかし、POSTを使うこともできる
(MoviesController に追加)
フレンドリーURL
• POSTだと次のような場合にページを再現できない
• ブックマークしたとき
• メールでURLを送るとき
• 解決策:BeginFormをオーバーロードして、POSTだっ
た場合はGETバージョンのIndexメソッドに転送する
ジャンル(Genre)で検索 : Controller
• MoviesController.csを再編集
ジャンル(Genre)で検索: Controller
パラメータ追加
ジャンルをデータベースから
獲得し、リストGenreLstへ
Distinct()
…重複を避ける
ViewBagにSelectList
として保存
movieGenreを調べて、カラ
でなかったら…
…今後のmovieはジャンルで
フィルタリングする
ジャンル(Genre)で検索: View
• Views/Movies/index.cshtml
• movieGenre … ControllerがViewBagに保存したやつ
• Html.DropDownList … ViewBagから IEnumerable<SelectListItem>
を探してドロップダウンリストを出力
動作確認と課題
• ジャンル、タイトル、およびその両方で検索して動作確認
• やってみよう: リリース日、価格で検索できるようにしよう
• 映画の主演俳優を追加するにはどうしたら良いでしょうか?
⇒データベースの変更が必要: 次の章へ。
DBに新しいフィールドを追加
• Entity FrameworkのCode First では、Migrationにより
Modelクラスへの変更をデータベースに反映させるこ
とができる
• このチュートリアルの最初のほうで試したように、
Modelクラスに見合うデータベーススキーマに同期す
るように、 Code Firstが自動的にテーブルを追加する。
• 同期していなければEntity Frameworkがエラーを返す
• エラーが出ることで、実行時の不具合の原因が明確
になる
Code First Migrations の設定
• 既存のデータベースを削除
ソリューションエクスプローラ
⇒ App_Data/Movies.mdfを右クリック
⇒ 削除
Code First Migrations の設定
• ライブラリパッケージマネージャを開く
ツール⇒NuGetパッケージマネージャー
⇒パッケージマネージャーコンソール
パッケージマネージャーコンソール
• プロンプト 「PM>」で次のコマンドレット
Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
• プロジェクトにMigrationフォルダが作成される
• Configuration.csを開き、次ページ
のように編集
※ 映画のタイトルと数はご自由に
Code First Migrations
• Code First Migrationsはマイグレーションの後に
毎回Seedメソッドを呼び出す
• AddOrUpdate:レコードが存在しなければinsert、
存在していればupdateを実行(upsert)
• AddOrUpdateの最初の引数:そのレコードが存在
しているかを確認するためのカラム。今回はTitle
(重複したTitleを登録しようとするとエラー)
• ソリューションのビルドを実行(やっておかない
とこれに続く操作でエラーになります)
Code First Migrations
• パッケージマネージャーコンソールで
add-migration Initial
• プロジェクトに Migrations/(タイムスタンプ)_Initial.csが
作成される。このファイルにはデータベーススキーマ
が含まれている。(開いて確認)
• 再びパッケージマネージャーコンソールで
update-database
「Initial」はmigrationファイルの
名前で、任意に指定できる
Code First Migrations
• update-databaseはレコードがすでに存在するとエラー
「シーケンスに複数の要素が含まれています」
• この場合はデータベースの削除からやり直し
• 成功していれば、アプリケーションを実行して/Movies
にアクセスするとSeedのレコードが一覧に出る
カラム追加
• 「Director」カラムを
追加したい
• 必要な作業は?
• Model、View、Controller
修正
• データベース更新
• まずModels/Movies.cs
• 変更したらビルド
(画面左下に注目)
MovieController.csの編集
public ActionResult Create([Bind(Include =
"ID,Title,Director,ReleaseDate,Genre,Price")] Movie
movie)
public ActionResult Edit([Bind(Include =
"ID,Title,Director,ReleaseDate,Genre,Price")] Movie
movie)
Views/Movies/Index.cshtml
• 一覧で監督が
出るように
Views/Movies/Create.cshtml
• Createで監督が出るように
• Details.cshtml、Edit.cshtml も同様に変更
エラーの確認
• この時点でIndex.cshtmlにアクセスするとエラー
⇒ カラムが変更されているため
• 対処法はいくつかあるが
今回はCode Firstの
「Migration」機能を
使う
Migrations/Configuration.cs の Seed を変更
• Moviesオブジェクトに「Director」を追加
• パッケージマネージャーコンソールで次のコマンド
add-migration Director
Migrationファイル
• 自動生成されたMigrationsファイルが開く
namespace MvcMovie.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Director : DbMigration
{
public override void Up()
{
AddColumn("dbo.Movies", "Director", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Movies", "Director");
}
}
}
update-database
• パッケージマネージャーコンソールで
update-database
• 再実行して動作確認
バリデーション
• セキュリティの観点から、ユーザから送られてくる
データは、すべてチェックしなければなりません。
• ASP.NET MVCのDRY(Don’t Repeat Yourself)により、
チェックは一度限りにする
⇒ エラーの軽減、開発のスピードアップ
• バリデーションのルールを1箇所に書けば、アプリケー
ションの全体で共有する
• Movie Modelにバリデーションを追加
⇒ Movie.csを編集
[StringLength(60, MinimumLength=1), Required]
[Display(Name = "タイトル")]
public string Title { get; set; }
[Display(Name = "監督")]
public string Director { get; set; }
[Display(Name = "リリース日")]
[DisplayFormat(DataFormatString="{0:yyyy-MM-dd}", ApplyFormatInEditMode=true)]
public DateTime ReleaseDate { get; set; }
[Display(Name = "ジャンル")]
public string Genre { get; set; }
[Display(Name = "価格")]
[DataType(DataType.Currency)]
[Range(1,999999, ErrorMessage="{0}は{1}~{2}の間で入力してください。")]
public decimal Price { get; set; }
最大60文字
最小1文字
必須
バリデーション Movie.cs
編集時も
表示形式を適用
{0} Display(Name)
{1} Range(Min)
{2} Range(Max)
テーブル構造の確認、変更
• サーバーエクスプローラー
⇒Moviesテーブル右クリック⇒テーブル定義を開く
• すべての文字列カラムのデータ型はnvarchar(MAX)
• このスキーマを変更するためMigrationを使う
• パッケージマネージャーコンソールで
add-migration DataAnnotations
update-database
自動生成されたDeleteメソッド
// GET: Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
削除ボタンを押すと最初にGETでリク
エストする。この時点では確認ウィン
ドウを出すのみで、データベースを変
更しない
POSTリクエストで、かつトークンの
バリデーションがOKだったとき
データベースに変更を加える
DeleteConfirmedメソッドの
アクション名を”Delete”に
まとめ
• ASP.NET MVC5でWebアプリケーションを作成した
• データはLocalDBに保存できた
• 映画の情報のCRUD(Create, Read, Update, Delete)と
検索の機能を作った
次のステップ
• 「Deploy a Secure ASP.NET MVC 5 app with Membership,
OAuth, and SQL Database to an Azure Web Site」
• 「Getting Started with Entity Framework 6 Code First using
MVC 5」
• マイクロソフト公式トレーニング#20486
「 ASP.NET MVC 4 Web アプリケーションの開発」(日本語)

More Related Content

PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
PPTX
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
PPTX
java.lang.OutOfMemoryError #渋谷java
PPTX
node-gypを使ったネイティブモジュールの作成
PPTX
C#の書き方
PPTX
Introduction to mvc architecture
PDF
Form認証で学ぶSpring Security入門
PDF
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
java.lang.OutOfMemoryError #渋谷java
node-gypを使ったネイティブモジュールの作成
C#の書き方
Introduction to mvc architecture
Form認証で学ぶSpring Security入門
コンポーネント指向による、Reactのベストプラクティスとバッドプラクティス

What's hot (20)

PPTX
Typescript Fundamentals
PDF
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
PPTX
TypeScript intro
PDF
Where狙いのキー、order by狙いのキー
PDF
TypeScript - An Introduction
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
PostgreSQL のイケてるテクニック7選
PPTX
負荷分散勉強会
PPTX
ASP.NET Core MVC + Web API with Overview
PDF
日本語テストメソッドについて
PDF
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(1)-アーキテクチャ、データソース
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
PPTX
Introduction à Angular
PDF
例外設計における大罪
PDF
SQLインジェクション総”習”編
PDF
WebSocket / WebRTCの技術紹介
PPTX
ミクシィ 21卒向け Android研修
PPTX
React js programming concept
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Typescript Fundamentals
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
TypeScript intro
Where狙いのキー、order by狙いのキー
TypeScript - An Introduction
RLSを用いたマルチテナント実装 for Django
PostgreSQL のイケてるテクニック7選
負荷分散勉強会
ASP.NET Core MVC + Web API with Overview
日本語テストメソッドについて
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(1)-アーキテクチャ、データソース
Dockerfileを改善するためのBest Practice 2019年版
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Introduction à Angular
例外設計における大罪
SQLインジェクション総”習”編
WebSocket / WebRTCの技術紹介
ミクシィ 21卒向け Android研修
React js programming concept
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Ad

Similar to はじめてのASP.NET MVC5 (20)

PDF
はじめての ASP.NET MVC
PDF
WEB TOUCH MEETING #52
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PPTX
20140924 mt cloud_handson_seminar
PDF
Entity Framework(Core)についての概要を学ぼう
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PDF
WebComponentsとPolymer
PDF
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PDF
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
PDF
Asp Net Mvc 基礎のキソ
PPTX
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
PDF
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
PPTX
コーディング不要! Entity Framework 6.1.3 + ASP.NET MVC 5 サンプル アプリケーション構築 手順書
PDF
Application development with c#, .net 6, blazor web assembly, asp.net web api...
PPTX
Slides for tiTokyo 2013 - Japanese version
PPTX
Slides for tiTokyo 2013 - Japanese version
PPT
20090328
PDF
ASP.NET MVC 2 ~新機能の紹介~
PPT
20050903
はじめての ASP.NET MVC
WEB TOUCH MEETING #52
Application development with c#, .net 6, blazor web assembly, asp.net web api...
20140924 mt cloud_handson_seminar
Entity Framework(Core)についての概要を学ぼう
Application development with c#, .net 6, blazor web assembly, asp.net web api...
WebComponentsとPolymer
Elastic on Azure Integration & Building React UI Based Search App Using Azure...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
Asp Net Mvc 基礎のキソ
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
コーディング不要! Entity Framework 6.1.3 + ASP.NET MVC 5 サンプル アプリケーション構築 手順書
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Slides for tiTokyo 2013 - Japanese version
Slides for tiTokyo 2013 - Japanese version
20090328
ASP.NET MVC 2 ~新機能の紹介~
20050903
Ad

More from Tomo Mizoe (7)

PPTX
CakePHP でお小遣い帳をつくってみよう
PPTX
CakePHP 2.x 複数レコード同時保存
PPTX
PHP, JavaScriptプログラマのためのC#入門
PDF
Git入門 (Windows)
PPTX
Visual Studio2013 でGithub(1) セットアップ~同期
PPTX
Unity勉強会資料2014-05-31
PPTX
MCP and Microsoft University
CakePHP でお小遣い帳をつくってみよう
CakePHP 2.x 複数レコード同時保存
PHP, JavaScriptプログラマのためのC#入門
Git入門 (Windows)
Visual Studio2013 でGithub(1) セットアップ~同期
Unity勉強会資料2014-05-31
MCP and Microsoft University

はじめてのASP.NET MVC5