MVC神韵---你想在哪解脱!(十一)
为了实现这一处理,我们需要在MoviesController类中追加第二个Create方法。这个Create方法具有一个[HttpPost]属性,它意味着我们将要用它来处理提交到“/Movies/Create”这个URL地址的请求。另外,所有提交到“/Movies/Create”这个URL地址的非POST的请求(即GET请求)将被第一个Create方法进行处理,即简单地返回一个空的表单。以下代码为MoviesController类中的两个Create方法的全部代码。
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Movie newMovie)
{
if (ModelState.IsValid)
{
db.Movies.Add(newMovie);
db.SaveChanges();
return RedirectToAction("Index");
}
else
return View(newMovie);
}
之前我们介绍了ASP.NET MVC可以自动地将一个URL地址中的查询字符串中的参数(例如:传递“/HelloWorld/Welcome?name=Scott&numTimes=5”)作为一个方法的参数传递到方法中。同样地,除了传递查询字符串中的参数之外,ASP.NET MVC也可以用这种方法来传递提交后的表单参数。提交后的表单参数可以作为一个独立的参数传递到一个方法中。例如ASP.NET MVC framework可以将我们提交的表单中的控件值作为参数传递到具有HttpPost属性的Create方法中。
[HttpPost]
public ActionResult Create(string title, DateTime releaseDate, string genre,decimal price){
提交的表单值也可以被映射到一个复合的,具有属性的对象(譬如我们的Movie类),并且作为一个单一的参数传递到一个方法中。请注意Create方法是怎样作为一个参数来接收Movie对象的。
[HttpPost]
public ActionResult Create(Movie newMovie)
{ if (ModelState.IsValid){
db.Movies.Add(newMovie);
db.SaveChanges();
return RedirectToAction("Index");
}
else
return View(newMovie);
}
ModelState.IsValid属性用来检查提交的表单中的数据是否能够被用来创建一个Movie对象。如果数据是有效的,我们的代码将把提交上来的这个Movie类追加在MoviesDBContext对象的实例中的Movies集合中。调用我们的MoviesDBContext对象实例的SaveChanges方法将把这个Movie对象保存在数据库中。保存数据完毕后,代码把画面重定向到MoviesController类的Index方法中,浏览器中将会打开电影清单显示画面,并且在电影清单中显示刚才追加的这条数据。如果提交的值是无效的,将会返回到电影信息追加画面中,并且在表单的各输入控件中显示各自的提交的值。各输入控件的Html.ValidationMessageFor帮助器将会显示对应的出错信息。