苏童 发表于 2015-7-6 05:02:11

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]
查看完整版本: MongoDB on Asp.Net MVC3–CRUD