ASP.NET MVC 学习8、Controller中的Detail和Delete方法

我们再来看看自动生成的Details 和Delete methods.

 MoviesController中的Details方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
public ActionResult Details(int? id)
      {
          if (id == null)
          {
              return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
          }
          Movie movie = db.Movies.Find(id);
          if (movie == null)
          {
              return HttpNotFound();
          }
          return View(movie);
      }

MVC架构引擎(scaffolding engine)创建的action method会在HTTP请求的时候被调用。上面的这个方法在GET请求的时候被调用,URL中会包含三个参数(segments):Movies Controller,Details Method,ID Value.

Code First 用Find Method把搜索变得更加简单。Detail方法中包含一个很重要的安全特性:在没有找到具体的movie实例前,代码不会进行任何的处理。

例如,如果hacker直接在把浏览器的地址直接由 http://localhost:xxxx/Movies/Details/1更改为http://localhost:xxxx/Movies/Details/1234 这个如果没有检查ID对应的Movie实例是否存在,页面就会报出一个database error


MoviesController中的Delete和DeleteConfirme方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//
      // GET: /Movies/Delete/5
 
      public ActionResult Delete(int id = 0)
      {
          Movie movie = db.Movies.Find(id);
          if (movie == null)
          {
              return HttpNotFound();
          }
          return View(movie);
      }
 
      //
      // POST: /Movies/Delete/5
 
      [HttpPost, ActionName("Delete")]
      public ActionResult DeleteConfirmed(int id)
      {
          Movie movie = db.Movies.Find(id);
          db.Movies.Remove(movie);
          db.SaveChanges();
          return RedirectToAction("Index");
      }

我们之前也有讲到过的,如果ActionResult Method 前不加前缀就默认为GET请求执行的方法,这个方法不会更新数据库的数据,只是返回所查询的数据。我们点击“Delete”连接的时候(http://localhost:9898/movies/Delete/1),会调用Delete方法查询到对应Id的数据,然后反馈到页面中。我们再次点击下面的Delete按钮就会提交一个HTTP POST请求,调用ActionDelete方法。

 

我们现在看一下,Delete方法和DeleteConfirm方法的区别:

CLR(common language runtime)请求加载方法的时候,会根据唯一的(unique)方法名和参数调用相应的方法。但是在这里,我们需要两个Delete methods,一个处理GET请求一个处理POST请求,这两个方法又有相同的参数。

 

为了这两个Delete方法区分开来,一个解决方法是给这两个方法不同的名字,把POST请求需要调用的Delete方法重新命名为DeleteConfirme.但是这样的话,更具默认路由,Delete的URL(http://localhost:9898/movies/Delete/1)请求也就只能调用GET 的 Delete Method,无法调用重命名的DeleteConfrime Method。为了解决这个问题,我们只需要在DeleteConfirme前加上ActionName("Delete") attribute就可以了。

 

小总结:

上面的这些我们已经建立了一个简单的CRUD的MVC Application。下一步我们应该把这个网址发布。Microsoft 给我们免费的web hosting 可以挂10个websites.

地址:free Windows Azure trial account.

ASP.NET MVC 学习8、Controller中的Detail和Delete方法,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。