In this part of the tutorial, you'll examine the automatically generated
Details
and Delete
methods. Examining the Details and Delete Methods
Open theMovie
controller and examine the Details
method.public ActionResult Details(int id = 0) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); }Code First makes it easy to search for data using the
Find
method. An important security feature built into the method is that the code
verifies that the Find
method has found a movie before the code
tries to do anything with it. For example, a hacker could introduce errors into
the site by changing the URL created by the links from
http://localhost:xxxx/Movies/Details/1 to something like
http://localhost:xxxx/Movies/Details/12345 (or some other value that
doesn't represent an actual movie). If you did not check for a null movie, a
null movie would result in a database error.Examine the
Delete
and DeleteConfirmed
methods.// 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"); }Note that the
HTTP Get
Delete
method doesn't delete
the specified movie, it returns a view of the movie where you can submit (HttpPost
)
the deletion.. Performing a delete operation in response to a GET request (or
for that matter, performing an edit operation, create operation, or any other
operation that changes data) opens up a security hole. For more information
about this, see Stephen Walther's blog entry
ASP.NET MVC Tip #46 — Don't use Delete Links because they create Security Holes.
The
HttpPost
method that deletes the data is named
DeleteConfirmed
to give the HTTP POST method a unique signature or name.
The two method signatures are shown below:// GET: /Movies/Delete/5 public ActionResult Delete(int id = 0) // // POST: /Movies/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id = 0)The common language runtime (CLR) requires overloaded methods to have a unique signature (same method name but different list of parameters). However, here you need two Delete methods -- one for GET and one for POST -- that both have the same signature. (They both need to accept a single integer as a parameter.)
To sort this out, you can do a couple of things. One is to give the methods different names. That's what the scaffolding mechanism did in he preceding example. However, this introduces a small problem: ASP.NET maps segments of a URL to action methods by name, and if you rename a method, routing normally wouldn't be able to find that method. The solution is what you see in the example, which is to add the
ActionName("Delete")
attribute to the
DeleteConfirmed
method. This effectively performs mapping for the
routing system so that a URL that includes /Delete/ for a POST request
will find the DeleteConfirmed
method.Another common way to avoid a problem with methods that have identical names and signatures is to artificially change the signature of the POST method to include an unused parameter. For example, some developers add a parameter type
FormCollection
that is passed to the POST method, and then simply
don't use the parameter: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"); }
Summary
You now have a complete ASP.NET MVC application that stores data in a local DB database. You can create, read, update, delete, and search for movies.Next Steps
After you have built and tested a web application, the next step is to make it available to other other people to use over the Internet. To do that, you have to deploy it to a web hosting provider. Microsoft offers free web hosting for up to 10 web sites in a free Windows Azure trial account. For information about how to deploy a Visual Studio web project to a Windows Azure Web Site, see Create and deploy an ASP.NET web site and SQL Database with Visual Studio. That tutorial also shows how to use Entity Framework Code First Migrations to deploy your SQL Server database to Windows Azure SQL Database (formerly SQL Azure). For more information about deployment, see ASP.NET Web Deployment Content Map.I now encourage you to move on to our intermediate-level Creating an Entity Framework Data Model for an ASP.NET MVC Application and MVC Music Store tutorials, to explore the ASP.NET articles on MSDN, and to check out the many videos and resources at http://asp.net/mvc to learn even more about ASP.NET MVC! The ASP.NET MVC forums are a great place to ask questions.
0 comments:
Post a Comment