MongoDB on Asp.Net MVC3–CRUD

上回我们已经创建了一个简单的Asp.Net MVC3网站并成功的连接了MongoDB。但只实现了创建和显示的功能。本回实现了完整的增删改查。

 

创建的部分,上次的代码中存在一些错误,造成了每个属性都会被创建为单独的一条记录,这并不是我们期待的结果。更改如下:

\Controllers\HomeController.cs

   1:          [HttpPost]
   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[key]));
  12:                  }
  13:   
  14:                  db["testTable"].Insert(doc);
  15:                  return RedirectToAction("Index");
  16:              }
  17:              catch
  18:              {
  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:  <h2>
   6:      Index</h2>
   7:  <ul>
   8:      @foreach (var testData in Model)
   9:      {
  10:          <li>
  11:              @{
  12:          var id = string.Empty;
  13:          foreach (var property in testData.Names)
  14:          {
  15:              if (property == "_id")
  16:              {
  17:                  id = testData[property].ToString();
  18:              }
  19:              else
  20:              {
  21:                  @string.Format("{0}:{1}", property, testData[property]);<br />                            
  22:              }
  23:          }                
  24:                  <a href="/Home/Delete/@id">Delete</a> <a href="/Home/Edit/@id">Edit</a> <a href="/Home/Details/@id">Details</a>
  25:              }
  26:          </li>
  27:      }
  28:  </ul>
  29:  <a href="/Home/Create">Create New</a>

总体来说,Razor引擎的代码写起来还是流畅+愉快。有一个简单的校技巧,想要链接目录从网站根目录开始的话,要用“/”开头。

显示效果如下:

image

接下来我们就分别来实现删除,编辑和查看功能。

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:              catch
  10:              {
  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:  <h2>
   6:      Edit</h2>
   7:  <form method="post" action="/Home/Edit/@Model["_id"].ToString()">
   8:      Name:
   9:      <input name="name" type="text" value="@Model["name"]" /><br />
  10:      Age:
  11:      <input name="age" type="text" value="@Model["age"]" /><br />
  12:      Gender:
  13:      <input name="gender" type="text" value="@Model["gender"]" /><br />
  14:      Married:
  15:      <input name="married" type="text" value="@Model["married"]" /><br />
  16:      <input type="submit" value="Update" />
  17:      <a href="/Home/Index">Cancel</a>
  18:  </form>

\Controllers\HomeController.cs

   1:          [HttpPost]
   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[key]);
  11:                  }
  12:   
  13:                  db["testTable"].Update(Query.EQ("_id", new BsonObjectId(id)), update);
  14:                  return RedirectToAction("Index");
  15:              }
  16:              catch
  17:              {
  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:              catch
  10:              {
  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的高级功能,敬请期待。

完整代码下载: https://files.cnblogs.com/pandora/MvcApplication1_CRUD.zip 

posted on 2011-05-28 20:02  Pandora  阅读(3039)  评论(8编辑  收藏  举报

导航