.NET Core - MVC 应用中的控制器方法和视图
电影应用的开头不错,但展示效果不理想.
例:ReleaseDate 应为两个词
打开Models/movie.cs,并添加以下代码:
using引用:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
ReleaseDate特性修改为:
[
<td>
<a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-action="Details" asp-route-id="@item.Id">Details</a> |
<a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
</td>
标记帮助程序使服务器端代码可以在Razor文件中参与创建和呈现HTML元素。
标记帮助程序从控制器操作方法和路由 ID 动态生成 HTML href
特性值。
重新调用在 Program.cs
文件中设置的路由的格式:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
.NET Core 将 https://localhost:5001/Movies/Edit/4
转换为对 Movies
控制器的 Edit
操作方法的请求,参数 Id
为 4。(控制器方法也称为操作方法。)
打开 Movies
控制器并检查两个 Edit
操作方法。
以下代码显示了 HTTP GET Edit
方法,此方法将提取电影并填充由 Edit.cshtml
Razor 文件生成的编辑表单。
例:// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.Movie == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
采用电影 ID
参数,使用Entity Framework FindAsync
方法查找电影,并将所选电影返回到“编辑”视图。 如果无法找到电影,则返回 NotFound
(HTTP 404)。
以下代码显示 HTTP POST Edit
方法,它会处理已发布的电影值。
例:// POST: Movies/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Title,ReleaseDate,Genre,Price")] 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(nameof(Index));
}
return View(movie);
}
备注:[Bind]特性是防止过度发布的一种方法。只应在[Bind]特性中包含想要更改的属性。
[HttpPost]特性指定只能为POST请求调用此Edit方法。可将 [HttpGet]
属性应用于第一个编辑方法,但不是必需,因为 [HttpGet]
是默认设置。
[ValidateAntiForgeryToken]特性 验证表单标记帮助程序中的防伪标记生成器生成的隐藏的 XSRF 标记,用于防止请求伪造,
并与编辑视图文件 (Views/Movies/Edit.cshtml
) 中生成的防伪标记相配对。
编辑视图文件使用表单标记帮助程序生成防伪标记。
例 : <form asp-action="Edit">
表单标记帮助程序会生成隐藏的防伪标记,此标记必须与电影控制器的 Edit
方法中 [ValidateAntiForgeryToken]
生成的防伪标记相匹配。
ModelState.IsValid :验证表单中提交的数据是否可以用于修改(编辑或更新)Movie
对象。
如果数据有效,将保存此数据。 通过调用数据库上下文的 SaveChangesAsync
方法,将更新(编辑)的电影数据保存到数据库。
保存数据后,代码将用户重定向到 MoviesController
类的 Index
操作方法,此方法显示电影集合,包括刚才所做的更改。
在表单发布到服务器之前,客户端验证会检查字段上的任何验证规则。 如果有任何验证错误,则将显示错误消息,并且不会发布表单。
如果禁用 JavaScript,则不会进行客户端验证,但服务器将检测无效的发布值,并且表单值将与错误消息一起重新显示。
当基架系统创建“编辑”视图时,它会检查 Movie
类并创建代码为类的每个属性呈现 <label>
和 <input>
元素。(查看Views/Movies/Edit.cshtml文件)
请注意视图模板在文件顶端有一个 @model MvcMovie.Models.Movie
语句。 @model MvcMovie.Models.Movie
指定视图期望的视图模板的模型为 Movie
类型。
<input>
元素位于 HTML <form>
元素中,后者的 action
特性设置为发布到 /Movies/Edit/id
URL。
当单击 Save
按钮时,表单数据将发布到服务器。 关闭 </form>
元素之前的最后一行显示表单标记帮助程序生成的隐藏的XSRF标记。
电影控制器中的所有 HttpGet
方法都遵循类似的模式。
它们获取电影对象(对于 Index
获取的是对象列表)并将对象(模型)传递给视图。
Create
方法将空的电影对象传递给 Create
视图。
在方法的 [HttpPost]
重载中,创建、编辑、删除或以其他方式修改数据的所有方法都执行此操作。
以 HTTP GET
方式修改数据是一种安全隐患。
以 HTTP GET
方法修改数据也违反了 HTTP 最佳做法和架构REST模式,后者指定 GET 请求不应更改应用程序的状态。
换句话说,执行 GET 操作应是没有任何隐患的安全操作,也不会修改持久数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律