ASP.NET MVCはじめました~MongoDBより値を取得し一覧表示する
概要
久しぶりにタイトルを戻してみました。というわけで今回はASP.NET MVC5(C#)からMongoDBにつなげてみます。まずはデータを取って一覧表示しようと思います。
Modelは簡単なユーザ情報を。こんな感じになります(デフォルト)。
環境
- Visual Studio Community 2015
- ASP.NET MVC5
- MongoDB 3.2
ドライバのインストール
パッケージマネージャーコンソールよりMongoDBのC#ドライバをインストールしましょう。
PM> Install-Package MongoDB.Driver
以下の3つがインストールされます。最新はいずれもv2.2.4です。
- MongoDB.Bson
- MongoDB.Driver
- MongoDB.Driver.Core
MongoDBへ接続する
接続文字列とデータベース名を渡してあげるだけ。Rubyのドライバと似てますね。ローカルインストールされたMongoDBのsampleデータベースへ接続してみます。
■MongoDB.cs
var connectionString = ConfigurationManager.AppSettings["MongoDBConnection"]; var database = ConfigurationManager.AppSettings["Database"]; _client = new MongoClient(connectionString); _database = _client.GetDatabase(database);
■Web.config
<appSettings> <add key="MongoDBConnection" value="mongodb://localhost"/> <add key="Database" value="sample"/> </appSettings>
データの取得
条件なしで全件取得です。データベース、コレクション、メソッドという流れはシェルのAPIと一緒なのでわかりやすいと思います。
■UserRepository.cs
private static readonly string Collection = "users"; public async Task<IEnumerable<User>> GetAllAsync() { var collection = GetCollection<User>(Collection); var filter = new BsonDocument(); var result = await collection.Find(filter).ToListAsync(); return result; }
ラムダ式も用意されてます。こっちのほうが直感的かもしれない?
return await collection.Find(_ => true).ToListAsync();
MVC
あとはいつも通りですね。コードを一式載せておきます。
Model
■User.cs
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System.ComponentModel.DataAnnotations; namespace aspnet_mvc5_mongodb.Models { public class User { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("name")] [Required] public string Name { get; set; } [BsonElement("age")] public int Age { get; set; } [BsonElement("email")] public string Email { get; set; } [BsonElement("address")] public string Address { get; set; } } }
View
■Index.cshtml
@model IEnumerable<aspnet_mvc5_mongodb.Models.User> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Name) </th> <th> @Html.DisplayNameFor(model => model.Age) </th> <th> @Html.DisplayNameFor(model => model.Email) </th> <th> @Html.DisplayNameFor(model => model.Address) </th> <th></th> </tr> @if (Model != null) { foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Age) </td> <td> @Html.DisplayFor(modelItem => item.Email) </td> <td> @Html.DisplayFor(modelItem => item.Address) </td> <td> @Html.ActionLink("Edit", "Edit", new { id = item.Id }) | @Html.ActionLink("Delete", "Delete", new { id = item.Id }) </td> </tr> } } </table>
Controller
■UsersController.cs
using aspnet_mvc5_mongodb.Models; using aspnet_mvc5_mongodb.Repositories; using aspnet_mvc5_mongodb.Repositories.Abstractions; using System; using System.Net; using System.Threading.Tasks; using System.Web.Mvc; namespace aspnet_mvc5_mongodb.Controllers { public class UsersController : Controller { private readonly IUserRepository _repository; public UsersController() : this(new UserRepository()) { } public UsersController(IUserRepository repository) { this._repository = repository; } public async Task<ActionResult> Index() { var model = await _repository.GetAllAsync(); return View(model); } ... } }
リポジトリ
■MongoDB.cs
using MongoDB.Driver; using System.Configuration; namespace aspnet_mvc5_mongodb.Repositories { public class MongoDB { protected static IMongoClient _client; protected static IMongoDatabase _database; public MongoDB() { var connectionString = ConfigurationManager.AppSettings["MongoDBConnection"]; var database = ConfigurationManager.AppSettings["Database"]; _client = new MongoClient(connectionString); _database = _client.GetDatabase(database); } public static IMongoCollection<T> GetCollection<T>(string collection) { return _database.GetCollection<T>(collection); } } }
■IUserRepository.cs
using aspnet_mvc5_mongodb.Models; using System.Collections.Generic; using System.Threading.Tasks; namespace aspnet_mvc5_mongodb.Repositories.Abstractions { public interface IUserRepository { Task<IEnumerable<User>> GetAllAsync(); ... } }
■UserRepository.cs
using aspnet_mvc5_mongodb.Models; using aspnet_mvc5_mongodb.Repositories.Abstractions; using MongoDB.Driver; using System.Collections.Generic; using System.Threading.Tasks; namespace aspnet_mvc5_mongodb.Repositories { public class UserRepository : MongoDB, IUserRepository { private static readonly string Collection = "users"; public async Task<IEnumerable<User>> GetAllAsync() { var collection = GetCollection<User>(Collection); return await collection.Find(_ => true).ToListAsync(); } ... } }
実行
シェルから適当にデータを登録します。
> db.users.insertMany( [ {name: "Alice", age:19, email: "Alice@simple.com", address: "New York"}, {name: "Steve", age:28, email: "Steve@simple.com", address: "San Francisco"}, {name: "Emily", age:31, email: "Emily@simple.com", address: "Chicago"} ] )
こんな感じでデータが登録されてればOK。
/Users/Indexにアクセス。
次回は画面からデータ登録できるようにしてみます☆彡