ASP.NET MVC3教程
ASP.NET MVC3 电影示例系列:共九篇 [文章列表]
这里的文章是ASP.NET官网的教程,这里做翻译而已,才疏学浅,翻译错误的地方,请指正,原文地址:Improving the Details and Delete Methods (C#)
在教程的当前部分,你将会对自动生成的Details和Delete方法做一些改进。这些修改都不是必须的,但仅通过一些少量的代码修改,你就能轻而易举的增强应用程序。
改进Details和Delete方法
当年构建完Movie控制器时,ASP.NET MVC生成的代码已经能够工作的非常好,但通过做一些细小的修改,程序就能变得更健壮。
打开Movie控制器修改Details方法,让它在电影不存在的时候返回HttpNotFound。但是,你必须将Ddetails的返回值从ViewResult改成ActionResult,因为HttpNotFound方法不返回ViewResult对象。你也还可以修改Details方法,为传递给Details的ID设置一个默认值(这有点类似本教程的第六节对Edit方法的修改。)1。下面例子展示修改后的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/1234(或者是其他不是真实电影数据的值)这样的连接来将错误显示到网站上。如果你不检查空(null)电影值,将产生的是一个数据库错误。
同样的,修改下De3lete和DeleteCOnfirmed方法,为他们的ID参数指定一个默认值并在电影没有找到的时候返回一个HttpNotFound。在Movie控制器中的Delete方法更新后的样子如下:
// 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");
}
注意Delete方法并没有删除数据。在GET请求的响应中执行delete将会引起安全漏洞(关于这点,执行编辑操作,创建操作或者其他任何修改数据的操作都是类似的)。要了解关于这点的更进一步信息,可以参见Stephen Walther的博客ASP.NET MVC Tip #46 -- Don't use Delete Links because they create Security Holes(注:这里请参看原文链接)。
为给HTTP POST方法一个唯一的签名或名称, 删除数据的HttpPost方法被命名为DeleteConfirmed。两个方法的签名如下:
// GET: /Movies/Delete/5
public ActionResult Delete(int id = 0)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id = 0)
公共语言运行库(CLR)要求重载的方法要有一个唯一的签名(一样的名字,不同的参数列表)。虽然如此,但在这里你需要两个Delete方法—— GET一个,POST一个——而且两个都需要一样的签名。(他们两个都需要接受一个整数作为参数)。
为了解决这个问题,你要做两件事。一件事为方法提供不同的名字。这就是我们前例使用的方法。然而,这带来一个小问题:ASP.NET 是根据名称来将URL中的各段映射到行为方法中,如果你为方法重命名了,路由一般情况下是不能找到方法的。解决方法就是你在例子中看到那样,为DeleteConfirmed方法添加ActionName("Delete")特性。在URL中包含/Delete/的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");
}
结束语
现在你已经有了一个将数据存放到SQL Server Compact数据库的完备ASP.NET MVC 应用程序了。你可以创建,读取,更新,删除和查找电影。
本基础教程从让你编写各个控制器,使用视图将他们关联起来,并使用硬编码的数据在他们之间传递。而后,你设计并创建了一个数据模型。Entity Framework Code First 快速的从这个数据模型中创建了一个数据库,ASP.NET MVC的架构系统自动生成了CRUD基本操作的行为方法和视图。为了让用户能搜索数据库你之后添加了一个搜索表单。为了在数据中包含新列你修改了数据库,并在此之后为了创建和显示新的数据更新了两个页面。你通过为数据标记DataAnnotations命名空间中的特性来添加验证。这使验证运行于客户端和服务端。
如果你想部署你的应用程序,在你本地的IIS7服务器上为该程序做前期测试对此是很有帮助的。你可以用Web Platform Installer链接来为ASP.NET应用程序启用IIS设置。下面是部署相关链接:
· ASP.NET Deployment Content Map (译注:链接地址为:ASP.NET Web Application Project Deployment Overview ,链接中文名为:ASP.NET Web应用程序项目部署概述)
· Enabling IIS 7.x (译注:启用IIS 7.x,也可以使用IIS 6)
· Web Application Projects Deployment2
接下来,我鼓励你移步道我们的Creating an Entity Framework Data Model for an ASP.NET MVC Application和MVC Music Store中级教程中,查看ASP.NET articles on MSDN,并在http://asp.net/mvc中众多的视频和资源中搜寻,以便更进一步学习ASP.NET MVC! ASP.NET forums是一个非常棒的问问题的地方。
尽情享受!
MitchellChu翻译备注:
1. 这里翻译的时候,将“但是...”这句放在了前面,更通顺,也好理解些。
2. 这个链接和第一个链接中文是指向同一个地方的,都是ASP.NET Web Application Project Deployment Overview,需要的可以在MSDN中查找。比较纠结的是为什么放两个一样的链接。