JavaScriptライブラリ人気調査によるとMVC系フレームワークはAngularJSぶっちぎりじゃないですか。
MS謹製ということでKnockout.js使ってしまってちょっと後悔。
Visual Studio 2013 Community Editionも出ましたし、以前にさらっといじったAngularJSを新しめの環境で使ってみたいと思います、
開発環境はVisual Studio 2013 Community Edition。
こちらのページのTodoサンプルをASP.NETで焼き直します。
WebAPI使って永続化をサポートするようにします。
プロジェクト
フレームワークは「.Net Framework 4.5.1」
テンプレートは[Visual C#] – [Web] – [ASP.NET Web Application]
名前は適当にAGSampleとしました。
さらにサブテンプレート(?)で[Empty]を選択、[MVC]にチェックを入れてOK。
参照設定とか細かくされてますけど、ソースファイルとして作られるのはそんなに多くありません。gitで見るとわかりやすい(?)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
\AGSample>git add .
\AGSample>git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: AGSample.sln
new file: AGSample/AGSample.csproj
new file: AGSample/App_Start/RouteConfig.cs
new file: AGSample/Global.asax
new file: AGSample/Global.asax.cs
new file: AGSample/Properties/AssemblyInfo.cs
new file: AGSample/Views/web.config
new file: AGSample/Web.Debug.config
new file: AGSample/Web.Release.config
new file: AGSample/Web.config
new file: AGSample/packages.config
|
ライブラリ追加
NuGetで
AngularJS
EntityFramework
EntityFramework.SqlServerCompact
をインストールします。
1
2
3
|
PM> Install-Package angularjs -Version 1.3.13
PM> Install-Package EntityFramework -Version 6.1.2
PM> Install-Package EntityFramework.SqlServerCompact -Version 6.1.2
|
バージョン部分は現時点での最新安定版。
Model
この辺りを斜め読みして、かなり端折ってます。
ModelsフォルダTodo.csを追加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace AGSample.Models
{
public class Todo
{
public int Id { get; set; }
public string Text { get; set; }
public bool Done { get; set; }
}
}
|
DALフォルダを作って、AGSampleContext.csとAGSampleInitializer.csを追加。(DAL:Data Access Layer)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using AGSample.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace AGSample.DAL
{
public class AGSampleContext : DbContext
{
public AGSampleContext() : base("AGSampleDb"){} //connection string name
public DbSet<Todo> Todos { get; set; }
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
using AGSample.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace AGSample.DAL
{
public class AGSampleInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<AGSampleContext>
{
protected override void Seed(AGSampleContext context) {
var todos = new List<Todo> {
new Todo{Text="AngularJSの学習",Done=false},
new Todo{Text="AngularJSのアプリケーション構築",Done=false},
};
todos.ForEach(t => context.Todos.Add(t));
context.SaveChanges();
}
}
}
|
web.configに接続文字列とInitializerの設定。
1
2
3
4
|
</configSections>
<connectionStrings>
<add name="AGSampleDb" connectionString="Data Source=|DataDirectory|\AGSampleDatabase.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
|
1
2
3
4
5
6
|
<entityFramework>
<contexts>
<context type="AGSample.DAL.AGSampleContext, AGSample">
<databaseInitializer type="AGSample.DAL.AGSampleInitializer, AGSample" />
</context>
</contexts>
|
ここでいったんコンパイル。
Controller(for API)
Controllersで右クリック [Add]-[Controller]で「Web API 2 Controller with actions,using Entity Framework」を選択。
ModelにTodo、Data ContextにAGSampleContext、せっかくなのでasyncなオプションをONにして、名前は「TodoesController」にしました。
AddするとTodoesController.csが追加され、なにやらreadme.txtが表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Visual Studio has added the full set of dependencies for ASP.NET Web API 2 to project 'AGSample'.
The Global.asax.cs file in the project may require additional changes to enable ASP.NET Web API.
1. Add the following namespace references:
using System.Web.Http;
using System.Web.Routing;
2. If the code does not already define an Application_Start method, add the following method:
protected void Application_Start()
{
}
3. Add the following lines to the beginning of the Application_Start method:
GlobalConfiguration.Configure(WebApiConfig.Register);
|
言われた通り、Global.asax.cs のApplication_Start()に
1
|
System.Web.Http.GlobalConfiguration.Configure(WebApiConfig.Register);
|
を追加。
RouteConfig.RegisterRoutes(RouteTable.Routes);より前に追加しないとダメみたいです。
Controller(for View)
そろそろ実行したいので表示用ページとコントローラとして、View\Home\Index.cshtmlとControllers\HomeController.csを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace AGSample.Controllers
{
public class HomeController : Controller
{
public ActionResult Index() { return View(); }
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@{
Layout = null;
}
<!DOCTYPE html>
<html ng-app>
<head>
<meta name="viewport" content="width=device-width" />
<title>AngularJS Sample SPA</title>
<script src="~/Scripts/angular.min.js"></script> <!-- don't need Url.Content from MVC4-->
</head>
<body>
<div>
Home\Index.cshtml
</div>
</body>
</html>
|
ちなみにウイザードでMVC5用のViewを作るとjQueryとかbootstrapとか勝手にインストールされるので、今回は使用しません。
View\Home\Index.cshtmlの編集ではインテリセンスが効きます!
やったね!
デバッグでhttp://localhost:????/api/todoes にアクセスするとデータが出るはず。
長くなったので、続きは次回に…