HTML<form>中的<input>元素的action属性用于设置请求发送到/Movies/Edit/idURL。当点击 Save按钮时表单数据会被发送到服务器。在</form>元素关闭前最后一行</form>展示了XSRF生成的隐藏域标识。
处理 POST 请求下面的列表显示了[HttpPost]不同版本的Edit方法。
[HttpPost] //手动高亮 [ValidateAntiForgeryToken] //手动高亮 public async Task<IActionResult> Edit(int id, [Bind("ID,Genre,Price,ReleaseDate,Title")] Movie movie) { if (id != movie.ID) { return NotFound(); } if (ModelState.IsValid) //手动高亮 { try { _context.Update(movie); //手动高亮 await _context.SaveChangesAsync(); //手动高亮 } catch (DbUpdateConcurrencyException) { if (!MovieExists(movie.ID)) { return NotFound(); } else { throw; } } return RedirectToAction("Index"); //手动高亮 } return View(movie); }[ValidateAntiForgeryToken]特性验证Form Tag Helper生成的存放在隐藏域中的XSRF反伪造标记。
模型绑定机制以发送表单数据创建Movie对象并作为movie参数。ModelState.IsValid方法验证表单提交的数据可以用来修改(编辑或更新)一个Movie对象。如果数据有效,就可以保存。更新(编辑) movie 数据会被存到数据库通过 database context 的SaveChangesAsync方法。数据保存完毕以后,这段代码将用户重定向到MoviesController类的Index方法,这个页面显示了改动后最新的Movie集合。
表单数据被发布到服务器之前,客户端校验会检查所有字段上的验证规则。如果有任何验证错误,则显示错误消息,并且表单数据不会被发送。如果禁用了 JavaScript,将不会有客户端验证,但服务器端将检测出发送数据是无效的,表单依旧会显示出错误信息。在稍后的教程中,我们会探讨Model Validation 模型验证更多关于验证的细节。Views/Book/Edit.cshtml视图模版中的Validation Tag Helper 负责显示错误信息。
movie controller 的所有HttpGet方法都遵循类似的模式。它们获取一个对象(或者对象列表,比如 Index),把对象(模型)传递到视图。Create方法创建一个空的对象到Create视图。诸如 Create、Edit、Delete 等之类的会修改数据的方法都会在[HttpPost]版本的重载方法中这样做(译者注:执行类似于前文所述的这些操作)。在 HTTP GET 方法中修改数据有安全风险,参考ASP.NET MVC 提示 #46 – 不要使用删除链接,因为他们制造安全漏洞。在HTTPGET方法中修改数据同样也违反 HTTP 最佳实践以及REST架构模式,其中规定 GET 请求不应该更改应用程序的状态。换句话说,执行 GET 操作应该是没有任何副作用,不会修改您的持久化的数据。
附录资源返回目录
posted @