请注意带第二个Edit方法被[HttpPost]特性所修饰。
[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); }[HttpPost]特性指定这个Edit方法只能被POST请求调用。你可以把[HttpGet]特性应用到第一个 edit 方法,但是,不是必须的,因为[HttpGet]是被默认使用的。
[ValidateAntiForgeryToken]特性是用来防止伪造请求的,会在(Views/Movies/Edit.cshtml)视图最终呈现文件中加入反伪造标记和服务器进行配对。edit 视图生成反伪造标记请参考Form Tag Helper。
<form asp-action="Edit">Form Tag Helper 生成一个隐藏域的防伪标记必须和 Movies controller 的Edit方法的 [ValidateAntiForgeryToken]产生的防伪标记相匹配。更多信息请参考Anti-Request Forgery。
HttpGetEdit方法获取 movie 的ID参数,通过使用 Entity Framework 的SingleOrDefaultAsync方法查找 movie,并将选中的 movie 填充到 Edit 视图。如果 movie 没有找到,返回NotFound(HTTP 404) 响应。
// GET: Movies/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null) { return NotFound(); } var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id); if (movie == null) { return NotFound(); } return View(movie); }在基架系统创建 Edit 视图的时候,会检查 Movie 类并为它的每个属性生成代码以呈现<label>和 <input>元素。下面的例子展示了 Visual Studio 基架系统生成的 Edit 视图:
@model MvcMovie.Models.Movie //手动高亮 @{ ViewData["Title"] = "Edit"; } <h2>Edit</h2> <form asp-action="Edit"> <div class="form-horizontal"> <h4>Movie</h4> <hr /> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <input type="hidden" asp-for="ID" /> <div class="form-group"> <label asp-for="Genre" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Genre" class="form-control" /> <span asp-validation-for="Genre" class="text-danger" /> </div> </div> <div class="form-group"> <label asp-for="Price" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Price" class="form-control" /> <span asp-validation-for="Price" class="text-danger" /> </div> </div> <div class="form-group"> <label asp-for="ReleaseDate" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="ReleaseDate" class="form-control" /> <span asp-validation-for="ReleaseDate" class="text-danger" /> </div> </div> <div class="form-group"> <label asp-for="Title" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Title" class="form-control" /> <span asp-validation-for="Title" class="text-danger" /> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Save" class="btn btn-default" /> </div> </div> </div> </form> <div> <a asp-action="Index">Back to List</a> </div> @section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }你会注意到为什么视图模版文件的顶部会有一行@modelMvcMovie.Models.Movie声明呢?— 因为这个声明指定这个视图模版的模型期待的类型是Movie 。
基架生成的代码使用几个 Tag Helper 方法来简化 HTML 标记。Label Tag Helper用来显示字段名(“Title”、”ReleaseDate”、”Genre” 或者 “Price”)。Input Tag Helper用来呈现 HTML<input>元素。Validation Tag Helper显示关联到属性的错误信息。
运行应用程序并导航到/MoviesURL。单击编辑链接。在浏览器中查看该页面的源代码。为<form> 元素生成的 HTML 如下所示。
<form action="/Movies/Edit/7" method="post"> //手动高亮 <div class="form-horizontal"> <h4>Movie</h4> <hr /> <div class="text-danger" /> <input type="hidden" data-val="true" data-val-required="The ID field is required." id="ID" name="ID" value="7" /> //手动高亮 <div class="form-group"> <label class="control-label col-md-2" for="Genre" /> <div class="col-md-10"> <input class="form-control" type="text" id="Genre" name="Genre" value="Western" /> //手动高亮 <span class="text-danger field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true" /> </div> </div> <div class="form-group"> <label class="control-label col-md-2" for="Price" /> <div class="col-md-10"> <input class="form-control" type="text" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" value="3.99" /> //手动高亮 <span class="text-danger field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true" /> </div> </div> <!-- Markup removed for brevity --> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Save" class="btn btn-default" /> //手动高亮 </div> </div> </div> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8Inyxgp63fRFqUePGvuI5jGZsloJu1L7X9le1gy7NCIlSduCRx9jDQClrV9pOTTmqUyXnJBXhmrjcUVDJyDUMm7-MF_9rK8aAZdRdlOri7FmKVkRe_2v5LIHGKFcTjPrWPYnc9AdSbomkiOSaTEg7RU" /> //手动高亮 </form>