MongoDB on Asp.Net MVC3–CRUD
上回我们已经创建了一个简单的Asp.Net MVC3网站并成功的连接了MongoDB。但只实现了创建和显示的功能。本回实现了完整的增删改查。创建的部分,上次的代码中存在一些错误,造成了每个属性都会被创建为单独的一条记录,这并不是我们期待的结果。更改如下:
\Controllers\HomeController.cs
1: 2: public ActionResult Create(FormCollection collection) 3: { 4: try 5: { 6: var db = GetDB(); 7: var doc = new BsonDocument(); 8: 9: foreach (var key in collection.AllKeys)10: {11: doc.Add(new BsonElement(key, collection));12: }13: 14: db["testTable"].Insert(doc);15: return RedirectToAction("Index");16: }17: catch18: {19: return View();20: }21: }
其实这样写并不安全,会把所有从页面POST过来的内容都作为属性创建并保存,但是简单啦。我们注意力主要集中在MongoDB的使用,安全性并不在考虑范围内。
显示的部分,也做了相应的修改,使其更符合Asp.Net MVC3 Razor引擎的规范:
\Controllers\HomeController.cs
1: public ActionResult Index() 2: { 3: var testTable = GetDB()["testTable"].FindAll(); 4: return View(testTable); 5: } \Views\Home\Index.cshtml
1:@{ 2: ViewBag.Title = "Index"; 3: Layout = "~/Views/Shared/_Layout.cshtml"; 4:} 5: 6: Index 7: 8: @foreach (var testData in Model) 9: {10: 11: @{12: var id = string.Empty;13: foreach (var property in testData.Names)14: {15: if (property == "_id")16: {17: id = testData.ToString();18: }19: else20: {21: @string.Format("{0}:{1}", property, testData); 22: }23: } 24: Delete Edit Details25: }26: 27: }28: 29:Create New
总体来说,Razor引擎的代码写起来还是流畅+愉快。有一个简单的校技巧,想要链接目录从网站根目录开始的话,要用“/”开头。
显示效果如下:
接下来我们就分别来实现删除,编辑和查看功能。
Details链接:
\Controllers\HomeController.cs
1: public ActionResult Details(string id) 2: { 3: try 4: { 5: var db = GetDB(); 6: var doc = db["testTable"].Find(Query.EQ("_id", new BsonObjectId(id))).First(); 7: return View(doc); 8: } 9: catch10: {11: return View();12: } 13: }
Edit页面:
\Controllers\HomeController.cs
1: public ActionResult Edit(string id) 2: { 3: var db = GetDB(); 4: var doc = db["testTable"].Find(Query.EQ("_id", new BsonObjectId(id))).First(); 5: return View(doc); 6: } \Home\Edit.cshtml
1:@{ 2: ViewBag.Title = "Edit"; 3: Layout = "~/Views/Shared/_Layout.cshtml"; 4:} 5: 6: Edit 7: 8: Name: 9: 10: Age:11: 12: Gender:13: 14: Married:15: 16: 17: Cancel18: \Controllers\HomeController.cs
1: 2: public ActionResult Edit(string id, FormCollection collection) 3: { 4: try 5: { 6: var db = GetDB(); 7: var update = new UpdateBuilder(); 8: foreach (string key in collection.Keys) 9: {10: update.Set(key, collection);11: }12: 13: db["testTable"].Update(Query.EQ("_id", new BsonObjectId(id)), update);14: return RedirectToAction("Index");15: }16: catch17: {18: return View();19: }20: } 删除功能:
\Controllers\HomeController.cs
1: public ActionResult Delete(string id) 2: { 3: try 4: { 5: var db = GetDB(); 6: db["testTable"].Remove(Query.EQ("_id", new BsonObjectId(id))); 7: return RedirectToAction("Index"); 8: } 9: catch10: {11: return View();12: }13: }
Global.asax.cx也可以改回Index开始:
1: routes.MapRoute( 2: "Default", // Route name 3: "{controller}/{action}/{id}", // URL with parameters 4: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 5: );
搞定。
不用设计数据库好爽啊。。想怎么插就怎么插。。。无Schema好爽啊!Razor基本很人性化,缺点很少。
不过感觉MongoDB关方的Connector功力比较弱,不支持Linq也就罢了,implicit也不实现,无法隐式转化格式,写起来很是别扭,不够流畅。
接下来准备研究一下MongoDB的高级功能,敬请期待。
完整代码下载: http://files.iyunv.com/pandora/MvcApplication1_CRUD.zip
页:
[1]