[JavaEE] 自学MVC4.0——查看Edit方法和Edit视图 {
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
//
// POST: /Movies/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
复制代码
注意第二个Edit方法前面加了HttpPost属性。该属性指定这个重载的Edit方法仅在接受Post请求时被调用。我们也可以将HttpGet属性应用在第一个Edit方法,但那不是必须的,因为它是默认的。(我们将为HttpGet方法隐性地指定HttpGet属性)。
HttpGet属性的Edit方法获取影片ID参数,使用Entity Framework的Find方法查找影片,并返回选中的影片给Edit视图。当Edit方法被调用时没有参数传入时,ID参数指定0作为默认值。当无法找到影片时,返回HttpNotFound。当脚手架系统创建Edit视图时,查看Movie类并为该类的每个属性创建<label>和<input>元素。(篇幅限制,不展示)
注意视图模板在文件顶部有@model Mvc_Movie.Models.Movie语句--指定了视图期望的模型是Movie类型。
脚手架代码使用几个Helper方法来生成流式的Html标记。Html.LabelFor显示字段名称(片名、价格、风格等)。Html.EditorFor生成<input>元素。Html.ValidationMessageFor显示属性关联的验证信息。
运行程序,导航到/Movies地址,点击Edit超链接。在浏览器中查看页面源码。(篇幅限制,不展示)
包含<input>元素的HTML<form>元素的action属性设置为/Movies/Edit,方法为post。点击Edit按钮,表单数据将被post到服务器,处理post请求。
下面列表显示了处理HttpPost请求版本的Edit方法
//
// POST: /Movies/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
复制代码
ASP.NET MVC模型绑定机制获取post表单值,创建Movie对象作为参数。ModelState.IsValid方法验证表单提交的数据可以用来修改(编辑或更新)Movie对象。如果数据有效,则影片数据将被保存到MovieDbContext实例集合中。新的影片数据在调用MovieDbContext的SaveChanges时保存到数据库,保存完数据后,代码引导用户到MoviesController的Index方法,在那展示包括刚刚修改的影片在内的影片集合。如果post的数据无效,将在表单中重新显示。Edit.cshtml视图模板中的Html.ValidationMessageFor助手负责显示错误信息。
所有的HttpGet方法遵循相似的模式,获取一个movie对象(或者对象集合,比如在Index例子中),从模型传递到视图。Create方法传递空对象给Create视图,创建、编辑、删除或者修改数据等所有操作放在HttpPost重载方法中。在HttpGet方法中修改数据存在安全隐患,详细信息。在Get方法中修改数据同样违法Http最佳实践以及Rest模式(指定Get请求不应当变更你的应用程序状态)。换句话说,执行Get操作应该是一个不影响以及不会修改此前数据的安全操作。
Ps:纯属入门级教程,高手请直接掠过。由于是自学,所以参照的是微软官方的教程。
|
|