原址:http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part9-cs
这个教程将会使用Microsoft Visual Web Developer 2010 Express Service Pack 1来教会您构建一个基于ASP.NET MVC Web应用。 在您开始之前,请确保已经安装了下面罗列的必备条件。您可以点击接下来的链接来下载它们:Web Platform Installer。或者您可以使用下面的链接来单个安装:
如果您使用的是Visual Studio 2010, 可以点击接下来的链接来安装这些必备条件: Visual Studio 2010 prerequisites.
在这个Visual Web Developer项目中将会全程使用c#. Download the C# version.。如果您比较擅长VB, 可以在这个教程中改为VB Visual Basic version
在教程的这次部分中,您将做一些改善,去自动的生成Details和
Delete方法,自动生成不是必须的,但是,这样就可以只用少量的代码添加上述功能。
改善Details和Delete方法
当您添加Movie控制器(controller)时,ASP.NET MVC可以很好的生成代码,但是您其实可以通过修改少量的代码更好的做到这一点。
打开Movie控制器(controller)并修改Details方法,当一部电影没有找到时,返回
改为HttpNotFound,您也需要为传过来的ID参数设置一个默认值。(您在这次教程中所作出的修改跟我们的系列文章六很相似)。然而,您需要把
Details方法的返回类型从
ViewResult
ActionResult
,因为这个HttpNotFound方法不会返回一个
对象。下面的示例展示了修改后的代码。ViewResult
public ActionResult Details(int id = 0) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); }
"Code First"可以使用Find方法很容易的搜索数据,我们构建这个方法的一个重要的安全特性是代码在尝试着做任何事情之前,先验证了Find方法是否找到了一部电影,例如,一个黑客可以在站点中把URL从http://localhost:xxxx/Movies/Details/1改为一些类似http://localhost:xxxx/Movies/Details/12345 (或一些其他的无法代表一部电影的值)的链接来引进错误信息,如果您不能为一部空电影做验证,这会导致一个数据库错误。
相似的,改变Delete和
DeleteConfirmed方法去为ID参数指定一个默认的值并且当没有找到一部电影的时候,返回
HttpNotFound。这个Movie控制器(controller)更新后的代码如下所示。
// 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请求的响应中执行了删除操作(或者就此而言,执行一个改变数据的修改操作,新建操作或任何其他操作)打开一部电影详细页面,这样可以更安全的进行删除。要查阅更多相关信息请查阅Stephen Walther的博客ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes
。
这个命名为DeleteConfirmed用来
删除了数据的HttpPost方法给了HTTP POST方法一个唯一的签名或名称。两个方法签名如下所示:
// 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片段映射到action方法的名称,并且如果您重命名一个方法,路由通常不会再找到这个方法,解决方法是您看到的上面的例子,增加ActionName("Delete")
属性到DeleteConfirmed
方法上,这有效的为系统执行了路由映射,以至于一个包含POST的URL includes/Delete/能够被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应用,数据存放在SQL Server Compact数据库中,您能够创建,读取,修改,删除和搜索电影。
在这个基本的教程中,最先您创建了一个控制器(controller),用来生成视图(view),通过硬编码的方式来传递数据。之后您创建和设计了一个数据模型(model),Entity Framework的"Code First"模式根据数据模型(model)自动地创建了一个数据库,并且ASP.NETMVC生成器系统自动的生成了action方法和基于CRUD操作的视图。然后您添加了一个搜索页面,让使用者可以在数据库中进行搜索,您改变了数据库结构,去增加了一个新的数据列,更新了创建和显示页面,增加这个新的数据,最后,您使用DataAnnotations
命名空间给数据模型添加了验证属性,验证在服务器端和客户端中运行。
如果您想部署您的应用,可以在IIS7服务器中进行测试,您能够使用Web Platform Installer 链接去为ASP.NET应用开启IIS设置,下面的链接会对您有所帮助:
我现在鼓励您去继续我们的中级课程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 MVC forums是一个很好的询问问题的地方。