您的位置:首页 > 编程语言 > ASP

【翻译】ASP.NET MVC4 入门(九) 查看一下Details和Delete方法中的代码(完结)

2013-04-04 16:27 274 查看
原文链接:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods

在这一部分,我们将会来看一下自动生成的Details和Delete方法中的代码。本文也是ASP.NET 4入门系列的最后一篇。

查看一下Details和Delete方法

打开Movie的controller来查看一下Details方法。

public ActionResult Details(int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}


Code First是的通过Find方法查找数据变得非常容易。在这个方法中一个重要的安全性方面的特性是代码在进行任何处理之前会确保Find方法确实找到了相关的电影数据。例如,一个黑客可能通过把超链接中的形如http://localhost:xxxx/Movies/Details/1这样的URL修改成http://localhost:xxxx/Movies/Details/12345这个样子(或者是其他一些不代表任何电影数据的值)来给网站引入一些错误。如果我们没有检查检索的movie是否为null,可能会引起一个数据库错误。

查看一下Delete和DeleteConfirmed方法。

// 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 = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}


注意一下HttpGet版本的Delete方法并没有删除指定的数据,仅仅是返回了一个电影的视图,在这个视图中你可以通过HttpPost的方式来提交删除的数据。对于Get请求执行一个删除操作(或者是一个编辑操作,或者是新建数据的操作,或者任何可能会修改数据的操作)会打开一个安全漏洞。关于这方面的更多信息,请参考Stephen Walther's的博客ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes.

删除数据的HttpPost版本的方法名字是DeleteConfirmed,这样做是为了给HttpPost方法一个唯一的方法签名。两个Delete有关的方法签名如下:

// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)


Common Language Runtime(CLR)要求重载的方法租都有唯一的方法签名(方法签名由方法名和参数列表共同组成,如果方法名和参数列表相同,则认为是相同的方法签名),但是,在这里我们需要两个Delete方法——一个是为了响应Get请求,一个响应Post请求——如果两个方法都命名为Delete的话,两个方法的签名就相同了。

为了解决这个冲突,我们有好几种解决方法。一种是为这些方法起不同的名字。这正是Scaffolding机制采用的做法。但是这样的话会引入另外一个小麻烦:ASP.NET通过URL来映射Controller中的Action,如果我们重新命名了一个方法,路由机制很可能就找不到这个Action了。解决方法就是你在上面的示例代码中看到的,为DeleteConfirmed方法添加一个ActionName("Delete")特性。这种方式有效地解决了这个问题,这样包含了/Delete/字样的URL的Post请求就会映射到DeleteConfirmed方法。

另外一种常用的解决这个小麻烦的方法是为Post版本的方法随意添加一个无用的参数,这样就是这个方法的签名不会与其他方法重复。例如,有些开发者会添加一个FormCollection类型的参数,这个参数是进行Post请求时自动传入的,但是方法内部并不适用这个参数。

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}


总结

现在我们有了一个完整的ASP.NET MVC应用来在一个数据库中存储电影相关的数据。我们可以新增,浏览,更新,删除和查找电影相关数据。



接下来做些什么

在完成了这个入门系列的学习之后,建议读者继续学习中级的Creating an Entity Framework Data Model for an ASP.NET MVC Application and MVC Music Store系列文章,在ASP.NET articles on MSDN中浏览相关文章,在http://asp.net/mvc这个网站上通过看视频和找资料来自学更多关于ASP.NET MVC的知识。并且ASP.NET MVC forums这个论坛是一个问问题的好地方。

本入门系列全部完结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: