ASP.NET MVC 2 Web 開発

8/13 現在の PPT です。
セッション当日の PPT と
内容が異なる場合があります。
ご了承ください。
セッション ID : T6-307
ASP.NET MVC 2 Web 開発
~ 全貌と応用、そして vNext に向けて ~
マイクロソフト株式会社
デベロッパー & プラットフォーム統括本部
エバンジェリスト
井上 章 (いのうえ あきら)
セッションの目的とゴール
Session Objectives and Takeaways
目的
ASP.NET MVC の全体像や応用方法について
ご理解を深めていただきます
デモを通して Web 開発の楽しさをお伝えします
ゴール
ASP.NET MVC の全体像や応用方法を
説明できるようになる
ASP.NET MVC Web アプリケーション開発が
おこなえるようになる
クラウドを意識したインターネット向け
Web アプリケーションを構築できるようになる
3
アジェンダ
~ 全貌、応用、v.Next ~
Introduction
Tech・Ed Japan 2009 を振り返ったり ...
全貌編
ASP.NET MVC 2 オーバービューなど ...
応用編
拡張ポイントやセキュリティなど ...
v.Next へ向けて
ASP.NET MVC 3 と Razor など ...
MVC 事例紹介
まとめ
4
5
Introduction
セッション ことはじめ ...
昨年の Tech·Ed Japan 2009 では ...
T2-306: ASP.NET MVC アプリケーション開発
ASP.NET MVC 2 サンプル ソース コードは ...
Edtter (エドったー) : http://edtter.codeplex.com/
Hands-on Lab で MVC を試すなら ...
H-316: ASP.NET MVC 2 と jQuery による Web 開発
~ Edtter を作ろう ~
Twitter でつぶやくなら ...
ハッシュ タグ: #techedjp #T6-307 #MVC
その他、私事で恐縮ですが ...
Blog: http://blogs.msdn.com/chack/
Twitter: http://twitter.com/chack411
6
ASP.NET 4
フレームワーク構成
Web フォーム
コア サービス
7
jQuery
8
MVC オーバービュー
Web アプリにおける MVC パターン
データと
ビジネス ロジック
odel
プレゼン
テーション
入力と制御
Request
9
ontroller
iew
Response
ASP.NET MVC 2
新しい Web アプリ開発フレームワーク
2010 年 3 月 RTM リリース (for VS 2008 SP1)
Visual Studio 2010 に標準搭載
オープン ソース (CodePlex)
各モジュールが 疎結合 に
単体テスト (TDD) が容易に
HTML ベース のページ開発が容易に
URL ルーティング が可能に
10
各モジュールが 疎結合 に ...
Why ?
11
Controller と View の命名ルール
コンセプト「規約は設定に勝る」
CoC (Convention over Configuration)
命名ルールによってモジュール間の結合を疎に
コードや設定ファイルなどで関連付けない
Controller クラス
Controller 名
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "MVC";
return View();
アクション名
}
}
12
テスト駆動開発 (TDD)
Controller Action の単体テストが容易に
単体テストには IIS などの Web サーバー は不要
Visual Studio 2008/2010 Professional 以上
NUnit, MBUnit, XUnit なども利用可能
テスト プロジェクトも同時に作成可能
テスト コードの雛型が自動生成
[TestMethod]
public void Index() {
HomeController ctrl = new HomeController();
ViewResult result = ctrl.Index() as ViewResult;
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("Hello", viewData["Message"]);
}
13
HTML ベース のページ開発が
容易に ...
Why ?
14
View の特徴と HTML 生成
埋め込みコード ブロックの利用
View における HTML 生成 (View エンジン) は
既定で Web フォーム (.aspx) を使用
System.Web.Mvc.WebFormViewEngine クラス
View (.aspx)
埋め込み
コード ブロック
<html>
<div><%: DateTime.Now.ToString() %></div>
<div><%: Html.TextBox("data", Model.data) %></div>
</html>
基本的に Web サーバー コントロールは使用しない
(ポストバックや ViewState は使用しない)
ヘルパー メソッドで HTML タグ ブロックを生成
15
HTML ヘルパー メソッド
HTML 生成を助ける関数群
メソッド名
概要
ActionLink
アクション名などから a タグを生成
BeginForm
form タグを生成
TextBox
TextBoxFor
input タグによる入力フィールドを生成
…
…
使用例
<%: Html.ActionLink("Go to Home", "Index") %>
<%: Html.TextBox("message", model.Message) %>
<%: Html.TextBoxFor(model => model.Message) %>
16
URL ルーティング
クリーン URL で SEO 対策
ASP.NET MVC では既定でルーティングが有効
System.Web.Routing 名前空間
例: http://example.com/Products/Car/Details/5
17
static void RegisterRoutes(RouteCollection routes) {
routes.MapRoute(
"Default",
ルーティング定義
"{controller}/{action}/{id}",
new { controller = "Car",
action = "List",
id = UrlParameter.Optional }
既定値
);
(省略時の値)
}
void Application_Start() {
RegisterRoutes(RouteTable.Routes);
}
出力キャッシュの利用
冗長なサーバー処理の回避
OutputCacheAttribute (ActionFilter) を利用
Controller Action の無駄な実行を制御
アプリケーション パフォーマンスの改善
[OutputCache(Duration=3600, VaryByParam="id")]
public ActionResult Details(int id) {
id 毎に
return View(myModel.GetData(id));
1 時間キャッシュ
}
キャッシュ プロファイル を利用した設定
アプリケーションを再ビルドすることなく設定変更可
[OutputCache(CacheProfile="MyCache")]
public ActionResult Index() {…}
Web.config - <system.web><caching><outputCacheSettings>
18
<outputCacheProfiles>
<add name="MyCache" duration="3600" … />
</outputCacheProfiles>
Data Annotation バリデーション
Model 中心の入力検証
宣言型で コードすっきり バリデーション
Model
属性ベースで
検証ルールを指定
public class MyData {
[DisplayName("年齢")]
[Required(ErrorMessage = "{0}を入力してね")]
[Range(0, 100)]
public int Age { get; set; }
エラー メッセージも
}
指定可能
View
<%: Html.TextBoxFor(model => model.Age) %>
<%: Html.ValidationMessageFor(model => model.Age) %>
Controller
19
public ActionResult Create(MyData myData) {
if (ModelState.IsValid) { … }
モデル バインドと
}
検証実行
Templated Helpers (1)
HTML ヘルパーにおけるテンプレートの利用
テンプレート
データ型やクラスに基づいた
部分 View の定義
既定の View エンジンでは
.ascx ファイルで記述
表示用
Views\<Controller>\
テンプレート DisplayTemplates\
格納先
Views\Shared\
DisplayTemplates\
ヘルパー
メソッド
20
編集用
Views\<Controller>\
EditorTemplates\
Views\Shared\
EditorTemplates\
DisplayForModel
EditorForModel
DisplayFor
EditorFor
Display
Editor
Templated Helpers (2)
型ベース 及び 名前付き テンプレート
A) データ型やクラスに基づいたテンプレートの利用
<%@ Page Inherits="ViewPage<MyData>" %>
<%: Html.DisplayForModel() %>
B) 名前付きテンプレートの利用
<%: Html.DisplayFor(m => m.Name, "NameTemplate") %>
21
View (*.aspx)
View (*.aspx)
: ViewPage<MyData>
<%: DisplayForModel() %>
<%: DisplayFor(m => m.name,
"NameTemplate") %>
DisplayTemplates\
MyData.ascx
DisplayTemplates\
NameTemplate.ascx
: ViewUserControl<MyData>
<p><%: Model.Name %></p>
: ViewUserControl<String>
<p><%: Model %></p>
RenderPartial と RenderAction
View の部分レンダリング
RenderPartial
部分 View をレンダリング
Html.RenderPartial(ViewName, … )
RenderAction
コントローラー アクションの実行結果をレンダリング
Html.RenderAction(ActionName, … )
View (.aspx)
View (.aspx)
M
<html>
<% RenderPartial(…); %>
View (.ascx)
</html> <div>…</div>
22
M
<html>
<% RenderAction(…); %>
M
Controller
M
</html> ActionResult Ad()
※ M は Model の略
AsyncController
非同期コントローラーの利用
AsyncController クラス
命名規約による容易な非同期処理の実装が可能
開始 : void ActionNameAsync()
終了 : ActionResult ActionNameCompleted()
※ View 名には Async / Completed の文字は不要
利点
Web サーバーの他のリクエスト
処理がブロックされない
時間のかかるネットワーク I/O
(Web API 呼び出し等) に有効
注意点
:AsyncController
1: 開始
他の処理
2: 完了
非同期処理はオーバーヘッドが大きい
同期処理においてボトル ネックになる部分に適用
23
object1:
ASP.NET MVC 2
その他の機能
Areas (区分)
単一 MVC プロジェクト内で
アプリケーションを分割
AreaRegistration.RegisterAllAreas()
アクション メソッドのデフォルト値
ActionResult Index([DefaultValue(1)] int id)
ActionResult Index(int id = 1)
HTTP Method 属性
HttpPost, HttpGet, HttpPut, HttpDelete
[HttpPost]
public ActionResult Create(MyData myData) { … }
24
25
MVC フレームワークの拡張
多くの拡張ポイントと容易なカスタマイズ
ValidationAttribute
odel
ModelBinder
ActionFilter
ActionResult
Request
Routing
26
ontroller
ViewEngine
HtmlHelper
iew
Response
ASP.NET MVC パイプライン
フレームワーク内部処理の流れ
HTTP
Request
IIS / ASP.NET
URL Routing
Controller
Controller Factory
ModelBinder
ActionFilter
Controller Action
Model
View
ActionResult
27
ViewEngine
Render HTML
HTTP
Response
View エンジンのカスタマイズ (1)
ViewEngine = HTML 生成テンプレート エンジン
View エンジンのカスタマイズが可能
View エンジンの変更 (Razor, NHaml, Spark, ...)
オリジナル View エンジンの作成
View の検索パスの変更
等々...
View Engine
Request
28
ontroller
iew Response
View エンジンのカスタマイズ (2)
さまざまな View エンジンの記法
WebFormViewEngine (.aspx 既定)
<h1><%: product.ProductName %></h1>
<p><%: Html.ActionLink("Add...", "Add") %></p>
NHaml - http://code.google.com/p/nhaml/
Rails Haml View エンジンの .NET 実装版
%h1= product.ProductName
%p= Html.ActionLink("Add...", "Add")
Spark - http://sparkviewengine.com/
Castle Project - MonoRail 向け View エンジン
<h1>${ product.ProductName }</h1>
<p>${ Html.ActionLink("Add...", "Add") }</p>
29
セキュリティ対策
ASP.NET MVC でも忘れずに
Controller 実行時の認証の要求
[Authorize] 属性 (ActionFilter)
HTML Encoding 構文 (WebFormViewEngine)
<%: SomeStringData %>
Cross Site Scripting (XSS)
Microsoft Web Protection Library
http://wpl.codeplex.com/
Cross Site Request Forgeries (CSRF)
Html.AntiForgeryToken()
[ValidateAntiForgeryToken]
JSON Hijacking
JsonResult
return Json(data, JsonRequestBehavior.DenyGet);
30
ASP.NET MVC 拡張ライブラリ
もっと活用したい ! あなたのために ...
MVC Contrib
http://mvccontrib.codeplex.com/
様々な拡張ライブラリ群
HTML Helper, Model Binder, Controller, Routing,
Action Result, Action Filter, Unit Test Helper, ...
T4MVC
http://mvccontrib.codeplex.com/releases/view/41582
T4 テンプレートを利用した自動コード生成
View や Controller コード内のリテラル文字列を排除
インテリセンス利用可 & 容易なコード メンテナンス
<% Html.RenderPartial("Banner"); %>
<% Html.RenderPartial(MVC.Home.Views.Banner); %>
31
32
ASP.NET MVC 3
新機能 概要
Preview 1 (2010 年 7 月 27 日 リリース)
http://go.microsoft.com/fwlink/?LinkID=157073
新機能
Razor, ASPX, … などの View エンジンの選択機能
ダイナミック View / ViewModel プロパティ
グローバル Action Filters
JsonValueProviderFactory と JSON モデル バインド
ValidationAttribute と IValidatableObject
新しい ActionResult 型 と Permanent Redirect
Dependency Injection (DI) サポート
ランタイム
ASP.NET 4 & Visual Studio 2010 以降
MVC 3 と Razor View エンジン
Small, Simple, Seamless
新しい "Razor 構文" View エンジンの追加
Razor プロジェクト テンプレート
[ View の追加 ] ダイアログ での View エンジン選択
View 毎に使用するエンジンを選択可能
Razor View 拡張子 (※変更の可能性あり)
.cshtml (C#) / .vbhtml (VB)
34
"Razor" 構文
Small, Simple, Seamless
Web ページ (View) の新しい記述構文
シンプル & クリーン
タイピング量とコード サイズの低減 (vs. PHP, ASPX)
便利な HTML ヘルパーと容易な拡張
C#, Visual Basic をサポート
.cshtml
35
@{ string title = "Hello Razor"; }
<h1>@title</h1>
<ul>
@foreach (var item in Model) {
<li>@item.Message</li>
}
</ul>
<p>Time is @DateTime.Now</p>
<p>@Html.ActionLink("Add...", "Add")</p>
36
ASP.NET MVC の採用事例
続々と増加中 ...
StackOverflow.com
http://stackoverflow.com/
Ruth's Chris Steakhouse
http://www.ruthschris.com/
MarketWatch
http://www.marketwatch.com/
Kelley Blue Book
http://www.kbb.com/
CodePlex - Open Source Project
http://www.codeplex.com/
Windows Live
http://home.live.com/
Bing Shopping
http://www.bing.com/shopping/
37
Orchard
新しい .NET ベース CMS
Orchard (オーチャード)
2010 年 8 月 3 日 v.0.5 (Beta) リリース
http://orchardproject.net/
http://orchard.codeplex.com/ (ソース コード等)
軽量な CMS
(Contents Management System)
Web サイト、ブログ、
ドキュメント管理など ...
ASP.NET MVC 2 ベース
容易なセットアップ (Web PI)
容易な拡張とカスタマイズ
(Visual Studio, WebMatrix)
38
国内採用事例のご紹介
こちらも続々と増えてます ...
現場入退場管理システム「デイリ」
携帯コールによる遠隔地の現場労働時間管理システム
コムテックス株式会社様 開発
http://www.ctx.co.jp/deiri_pr/index.html
システム構成
Windows Azure (Web Role + SQL Azure)
ASP.NET MVC + jQuery
ASP.NET メンバーシップ & ロール管理
オンプレミス連携 (電話着信処理など)
39
40
ASP.NET MVC 2
Small + Simple + Seamless = Smart !
ASPX, Razor, ...
41
M V
C
42
Model / View / Controller
実装コード例
Model と Controller
public class HomeController : Controller { Model の準備
MyModelService myModel = new MyModelService();
public ActionResult Edit(int id) {
MyData md = myModel.GetData(id);
return View(md);
}
}
View の呼び出し
View (Edit.aspx)
HTTP リクエスト
によるメソッドの
実行
(例: Home/Edit/5 )
ロジックの実行と
データ取得
HTML タグ生成と
データの埋め込み
<html>
<p><%: Html.TextBox("data", Model.data) %></p>
</html>
43
ModelBinder とは ?
HTTP リクエスト データの自動バインド
アクション メソッド 引数への自動バインド
既定のバインドは DefaultModelBinder
以下のオブジェクト型をバインド
Model クラス
プリミティブ型 (String, DateTime, ...)
コレクション (ICollection<T>, IList<T>, ...)
バインドありの場合
ActionResult Create(MyData myData) {
if (ModelState.IsValid) {
MyData へバインド
string name = myData.Name;
...
バインドなしの場合
44
ActionResult Create() {
string name = Request["Name"];
...
ModelBinder 拡張
カスタム機能の追加
インターフェース : IModelBinder
ベース クラス : DefaultModelBinder
主な拡張ポイント
object BindModel(…);
object CreateModel(…);
bool OnModelUpdating(…);
void OnModelUpdated(…);
bool OnPropertyValidating(…);
void OnPropertyValidated(…);
ModelBinder の登録
//
//
//
//
//
//
モデル バインド実行
モデル型オブジェクト生成
モデル更新開始
モデル更新完了
プロパティ検証開始
プロパティ検証完了
// Application_Start() で下記のいずれかで指定
ModelBinders.Binders.DefaultBinder = new MyBinder();
ModelBinders.Binders.Add(typeof(MyData),new MyBinder());
// または、引数の属性で指定
[ModelBinder(typeof(MyBinder))]
45
ActionFilter 拡張
アクション メソッド実行時の拡張ポイント
アクション メソッドの実行前後に独自機能を追加
ベース クラス
ActionFilterAttribute : FilterAttribute
使用例
public class LogAttribute : ActionFilterAttribute {
public override void OnActionExecuting(…) {…}
public override void OnResultExecuted(…) {…}
}
Controller や Action に属性を指定
[Log]
public class HomeController : Controller {…}
既存の FilterAttribute 派生クラス
AuthorizeAttribute, ValidateAntiForgeryTokenAttribute,
ChildActionOnlyAttribute, RequireHttpsAttribute ...
46
Microsoft Web Platform ホーム
まずはここからスタート !
www.microsoft.com/web
Web プラットフォームの紹介
サーバー
フレームワーク
データ ベース
ツール
Web App Gallery
ダウンロード
プログラム紹介
ホスティング情報
事例紹介
などなど ...
47
Web Platform Installer (Web PI)
コンポーネントやアプリの一括管理ツール
様々な Web 開発ツールやコンポーネント、オープンソース
の Web アプリのインストールなどを一括管理する無償ツール
IIS, Visual Web Developer, SQL Server Express, .NET Framework ...
WordPress, XOOPS Cube Legacy, SugarCRM, DotNetNuke ...
Web PI ダウンロード
http://www.microsoft.com/web/downloads/platform.aspx
48
WebsiteSpark
Web 開発会社様 支援プログラム
プログラム特典:
開発ツール
Visual Studio 2010 Professional x 3
Expression Studio 4 x 1
Expression Web 4 x 2
サーバー ソフトウェア(検証、デモ用)
Windows Web Server 2008 R2 x 3
SQL Server 2008 Web Edition x 3
※これらのソフトウェアは MSDN サブスクリプションの
ダウンロード サイトから提供させていただきます
技術サポート
技術サポートを 2 インシデント無償提供
その他
参加企業の露出機会の提供
技術資料、トレーニングマテリアルなどの提供
参加要件:
• Web 開発ビジネスを主業務としていること
(個人事業主を含む)
• 従業員数が 25 名以下であること
• プログラム加盟後、6 か月以内に Windows
プラットフォームを用いた新しいドメインの
Web サイトを開発すること。
期間:最大 3 年間
費用:無料(プログラム終了時にプログラム提供料
として 100 米ドルお支払いいただきます)
www.microsoft.com/web/websitespark
49
最新テクノロジーと Web 開発
新しいプラットフォームも続々と ...
WebMatrix (Beta)
http://www.microsoft.com/web/webmatrix/
軽量な Web サイトを構築・管理する統合ツール
オープン ソースの Web アプリのインストールやカスタマイズ
Visual Studio LightSwitch (Beta)
http://www.microsoft.com/visualstudio/en-us/lightswitch/
ベーシックな業務アプリケーションを迅速に構築
基本コードはテンプレートから自動生成
Internet Explorer 9 (Preview)
http://ie.microsoft.com/testdrive/
Web 標準への準拠、次世代規格 HTML5, CSS3 への対応
50
関連セッション
ASP.NET Web 開発はこちら ...
T6-305 : 8/25 15:20 – 16:30 Room D
ASP.NET 4 で実践する Web フォーム開発と配置
T6-306 : 8/26 16:55 – 18:05 Room D
jQuery と ASP.NET AJAX Control Toolkit による
AJAX アプリケーション開発
BOF-10 : 8/27 13:45 – 14:55
マイクロソフトの Web テクノロジ最前線と現実解を語ろう
H-316 : 8/25 – 8/27 各日 1 セッション
ASP.NET MVC 2 と jQuery による Web 開発
~ Edtter を作ろう~
T6-309 : 8/25 16:55 – 18:05 Room C
詳説 ! Visual Basic 10, C# 4.0 の新機能
~ Visual Studio 2010 で進化したコーディング環境 ~
51
リファレンス #1
Microsoft Web Platform
http://www.microsoft.com/web/
MSDN ASP.NET デベロッパー センター
http://msdn.microsoft.com/ja-jp/asp.net/default.aspx
Microsoft Web 開発ガイドライン
http://msdn.microsoft.com/ja-jp/asp.net/ff602016.aspx
ASP.NET MVC チュートリアル
http://msdn.microsoft.com/ja-jp/asp.net/ff630143.aspx
ASP.NET MVC 2 サンプル ソース コード ~ Edtter ~
http://edtter.codeplex.com/
THE TRUTH IS OUT THERE ~ 井上 章のブログ ~
http://blogs.msdn.com/chack/
52
リファレンス #2
ASP.NET MVC: The Official Microsoft ASP.NET Site (英語)
http://www.asp.net/mvc
CodePlex - ASP.NET MVC (英語)
http://aspnet.codeplex.com/wikipage?title=MVC
ScottGu's Blog (英語)
http://weblogs.asp.net/scottgu/default.aspx
Phil Haack's Blog (英語)
http://haacked.com/Default.aspx
Scott Hanselman's Blog (英語)
http://www.hanselman.com/blog/
K. Scott Allen's Blog (英語)
http://odetocode.com/Blogs/scott/default.aspx
53
ご清聴ありがとうございました!
T6-307
アンケートにご協力ください。
© 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should
not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS,
IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.