AngularJS + ASP.NET MVC 4でなんか作ってみます。
Visual Studio 2010 + MVC4で開発します。2013とかほしいっす。
プロジェクト準備
MVC4の空プロジェクトを作成します。
IE8もサポートしなきゃいけないだろうから
AngularJS 1.2系のangular.min.js
jQuery 1.X系のjquery-1.11.0.min.js
とか使います。
プロジェクトに “Scripts”フォルダを作って、
angular.min.jsとjquery-1.11.0.min.jsをコピーします。
続いてNuGetで
「Entity Framework 日本語リソース」
「EntityFramework.SqlServerCompact」
をインストールします。
Model
サンプルなんでコードファーストで行ってみます。
Entity
\Models\Task.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
namespace Mvc4App.Models
{
public enum TaskStatus
{
New,
Completed,
Canceled
}
[Table("Tasks")]
public class Task
{
public int Id { get; set; }
public TaskStatus Status{ get; set;}
public string Description { get; set; }
}
}
|
DB Context
\Models\TaskContext.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.Data.Entity;
namespace Mvc4App.Models
{
public class TaskContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
}
}
|
Connection
web.config
1
2
3
4
5
|
<configuration>
<connectionStrings>
<add name="TaskContext" connectionString="Data Source=|DataDirectory|TaskList.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
<configuration>
|
Global.asax.csにSetInitializerとイニシャルデータ用コード追加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
protected void Application_Start() {
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// サンプルなんでとりあえず毎回作り直す方向で。
Database.SetInitializer<Models.TaskContext>(new DropCreateDatabaseAlways<Models.TaskContext>());
using (var db = new Models.TaskContext()) {
var task = new Models.Task();
task.Status = Models.TaskStatus.New;
task.Description = "てすとっす";
db.Tasks.Add(task);
db.SaveChanges();
}
}
|
ここまででとりあえず実行してみると
App_Data\TaskList.sdf
データベースが作られるはずです。
Controller
Controllersフォルダで右クリック→追加→コントローラー
コントローラー名はてきとーに:TasksController
テンプレートには「空の読み取り/書き込み操作のあるAPIコントローラー」を選んでみました。
そうするとString型を対象としたコントローラができるので、Task用に書き換えます。
最初、「Entity Frameworkを使用した、読み取り/書き込み操作のあるAPIコントローラー」を試したんですが、
‘Mvc4App.Models.Task’ のメタデータを取得できませんでした。型 ‘System.Data.Entity.Core.Objects.ObjectContext’ のオブジェクトを型 ‘System.Data.Objects.ObjectContext’ にキャストできません。
とか出てダメでした。使えれば便利そうなんですけどね。
こんな感じになりました。エラー処理とかバリデーションとか一切入ってません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace Mvc4App.Controllers
{
public class TasksController : ApiController
{
// GET api/tasks
public IEnumerable<Models.Task> Get()
{
using (var db = new Models.TaskContext()) {
return db.Tasks.ToArray();
}
}
// GET api/tasks/5
public Models.Task Get(int id)
{
using (var db = new Models.TaskContext()) {
return db.Tasks.FirstOrDefault(t => t.Id == id);
}
}
// POST api/tasks
public void Post([FromBody]Models.Task value)
{
using (var db = new Models.TaskContext()) {
db.Tasks.Add(value);
db.SaveChanges();
}
}
// PUT api/tasks/5
public void Put(int id, [FromBody]Models.Task value)
{
using (var db = new Models.TaskContext()) {
db.Entry<Models.Task>(value).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
}
}
// DELETE api/tasks/5
public void Delete(int id)
{
using (var db = new Models.TaskContext()) {
var task = db.Tasks.FirstOrDefault(t => t.Id == id);
if (task != null) {
db.Tasks.Remove(task);
db.SaveChanges();
}
}
}
}
}
|
TasksはWebAPIに専念するのでTasks用Viewは在りません。
デバッグ実行して、http://localhost:????/api/tasks にアクセスするとテストデータが出るはずです。
(IEだとエラーになるかも,chromeだと多少整形されたXMLで表示されました)
Model,Controllerは通常のコードですね。
次回View。AngularJSを使ってみます。