第 10 部分,检查 ASP.NET Core 应用的 Details 和 Delete 方法
注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 有关当前版本,请参阅本文的 .NET 9 版本。
打开电影控制器,并检查 Details
方法:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
创建此操作方法的 MVC 基架引擎添加显示调用方法的 HTTP 请求的注释。 在此情况下,它是包含三个 URL 段的 GET 请求,这三个段为 Movies
控制器、Details
方法和 id
值。 回顾这些在 Program.cs
中定义的段。
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF 可以使用 FirstOrDefaultAsync
方法轻松搜索数据。 该方法中内置的一个重要安全功能是,代码会先验证搜索方法已经找到电影,然后再执行操作。 例如,一个黑客可能通过将链接创建的 URL 从 http://localhost:{PORT}/Movies/Details/1
更改为类似 http://localhost:{PORT}/Movies/Details/12345
的值(或者不代表任何实际电影的其他值)将错误引入站点。 如果未检查是否有空电影,则应用可能引发异常。
检查 Delete
和 DeleteConfirmed
方法。
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
请注意,HTTP GET Delete
方法不删除指定的电影,而是返回可在其中提交 (HttpPost) 删除的电影视图。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。
删除数据的 [HttpPost]
方法命名为 DeleteConfirmed
,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
公共语言运行时 (CLR) 需要重载方法拥有唯一的参数签名(相同的方法名称但不同的参数列表)。 但是,这里需要两个 Delete
方法 -- 一个用于 GET,另一个用于 POST -- 这两个方法拥有相同的参数签名。 (它们都需要接受单个整数作为参数。)
可通过两种方法解决此问题,一种是为方法提供不同的名称。 这正是前面的示例中的基架机制进行的操作。 但是,这会造成一个小问题:ASP.NET 按名称将 URL 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 DeleteConfirmed
方法添加 ActionName("Delete")
属性。 该属性对路由系统执行映射,以便包括 POST 请求的 /Delete/ 的 URL可找到 DeleteConfirmed
方法。
对于名称和签名相同的方法,另一个常用解决方法是手动更改 POST 方法的签名以包括额外(未使用)的参数。 这正是前面的文章中添加 notUsed
参数时进行的操作。 这里为了 [HttpPost] Delete
方法可以执行同样的操作:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
发布到 Azure
若要了解如何部署到 Azure,请参阅教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用。
可靠的 Web 应用模式
请观看《适用于 .NET 的可靠 Web 应用模式》YouTube 视频和文章,了解如何创建新式、可靠、高性能、可测试、经济高效且可缩放的 ASP.NET Core 应用,无论是从头开始创建还是重构现有应用。
打开电影控制器,并检查 Details
方法:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
创建此操作方法的 MVC 基架引擎添加显示调用方法的 HTTP 请求的注释。 在此情况下,它是包含三个 URL 段的 GET 请求,这三个段为 Movies
控制器、Details
方法和 id
值。 回顾这些在 Program.cs
中定义的段。
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF 可以使用 FirstOrDefaultAsync
方法轻松搜索数据。 该方法中内置的一个重要安全功能是,代码会先验证搜索方法已经找到电影,然后再执行操作。 例如,一个黑客可能通过将链接创建的 URL 从 http://localhost:{PORT}/Movies/Details/1
更改为类似 http://localhost:{PORT}/Movies/Details/12345
的值(或者不代表任何实际电影的其他值)将错误引入站点。 如果未检查是否有空电影,则应用可能引发异常。
检查 Delete
和 DeleteConfirmed
方法。
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
请注意,HTTP GET Delete
方法不删除指定的电影,而是返回可在其中提交 (HttpPost) 删除的电影视图。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。
删除数据的 [HttpPost]
方法命名为 DeleteConfirmed
,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
公共语言运行时 (CLR) 需要重载方法拥有唯一的参数签名(相同的方法名称但不同的参数列表)。 但是,这里需要两个 Delete
方法 -- 一个用于 GET,另一个用于 POST -- 这两个方法拥有相同的参数签名。 (它们都需要接受单个整数作为参数。)
可通过两种方法解决此问题,一种是为方法提供不同的名称。 这正是前面的示例中的基架机制进行的操作。 但是,这会造成一个小问题:ASP.NET 按名称将 URL 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 DeleteConfirmed
方法添加 ActionName("Delete")
属性。 该属性对路由系统执行映射,以便包括 POST 请求的 /Delete/ 的 URL可找到 DeleteConfirmed
方法。
对于名称和签名相同的方法,另一个常用解决方法是手动更改 POST 方法的签名以包括额外(未使用)的参数。 这正是前面的文章中添加 notUsed
参数时进行的操作。 这里为了 [HttpPost] Delete
方法可以执行同样的操作:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
发布到 Azure
若要了解如何部署到 Azure,请参阅教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用。
可靠的 Web 应用模式
请观看《适用于 .NET 的可靠 Web 应用模式》YouTube 视频和文章,了解如何创建新式、可靠、高性能、可测试、经济高效且可缩放的 ASP.NET Core 应用,无论是从头开始创建还是重构现有应用。
打开电影控制器,并检查 Details
方法:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
创建此操作方法的 MVC 基架引擎添加显示调用方法的 HTTP 请求的注释。 在此情况下,它是包含三个 URL 段的 GET 请求,这三个段为 Movies
控制器、Details
方法和 id
值。 回顾这些在 Program.cs
中定义的段。
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF 可以使用 FirstOrDefaultAsync
方法轻松搜索数据。 该方法中内置的一个重要安全功能是,代码会先验证搜索方法已经找到电影,然后再执行操作。 例如,一个黑客可能通过将链接创建的 URL 从 http://localhost:{PORT}/Movies/Details/1
更改为类似 http://localhost:{PORT}/Movies/Details/12345
的值(或者不代表任何实际电影的其他值)将错误引入站点。 如果未检查是否有空电影,则应用可能引发异常。
检查 Delete
和 DeleteConfirmed
方法。
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
if (movie != null)
{
_context.Movie.Remove(movie);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
请注意,HTTP GET Delete
方法不删除指定的电影,而是返回可在其中提交 (HttpPost) 删除的电影视图。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。
删除数据的 [HttpPost]
方法命名为 DeleteConfirmed
,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
公共语言运行时 (CLR) 需要重载方法拥有唯一的参数签名(相同的方法名称但不同的参数列表)。 但是,这里需要两个 Delete
方法 -- 一个用于 GET,另一个用于 POST -- 这两个方法拥有相同的参数签名。 (它们都需要接受单个整数作为参数。)
可通过两种方法解决此问题,一种是为方法提供不同的名称。 这正是前面的示例中的基架机制进行的操作。 但是,这会造成一个小问题:ASP.NET 按名称将 URL 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 DeleteConfirmed
方法添加 ActionName("Delete")
属性。 该属性对路由系统执行映射,以便包括 POST 请求的 /Delete/ 的 URL可找到 DeleteConfirmed
方法。
对于名称和签名相同的方法,另一个常用解决方法是手动更改 POST 方法的签名以包括额外(未使用)的参数。 这正是前面的文章中添加 notUsed
参数时进行的操作。 这里为了 [HttpPost] Delete
方法可以执行同样的操作:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
发布到 Azure
若要了解如何部署到 Azure,请参阅教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用。
打开电影控制器,并检查 Details
方法:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
创建此操作方法的 MVC 基架引擎添加显示调用方法的 HTTP 请求的注释。 在此情况下,它是包含三个 URL 段的 GET 请求,这三个段为 Movies
控制器、Details
方法和 id
值。 回顾这些在 Program.cs
中定义的段。
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
EF 可以使用 FirstOrDefaultAsync
方法轻松搜索数据。 该方法中内置的一个重要安全功能是,代码会先验证搜索方法已经找到电影,然后再执行操作。 例如,一个黑客可能通过将链接创建的 URL 从 http://localhost:{PORT}/Movies/Details/1
更改为类似 http://localhost:{PORT}/Movies/Details/12345
的值(或者不代表任何实际电影的其他值)将错误引入站点。 如果未检查是否有空电影,则应用可能引发异常。
检查 Delete
和 DeleteConfirmed
方法。
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
_context.Movie.Remove(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
请注意,HTTP GET Delete
方法不删除指定的电影,而是返回可在其中提交 (HttpPost) 删除的电影视图。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。
删除数据的 [HttpPost]
方法命名为 DeleteConfirmed
,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
公共语言运行时 (CLR) 需要重载方法拥有唯一的参数签名(相同的方法名称但不同的参数列表)。 但是,这里需要两个 Delete
方法 -- 一个用于 GET,另一个用于 POST -- 这两个方法拥有相同的参数签名。 (它们都需要接受单个整数作为参数。)
可通过两种方法解决此问题,一种是为方法提供不同的名称。 这正是前面的示例中的基架机制进行的操作。 但是,这会造成一个小问题:ASP.NET 按名称将 URL 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 DeleteConfirmed
方法添加 ActionName("Delete")
属性。 该属性对路由系统执行映射,以便包括 POST 请求的 /Delete/ 的 URL可找到 DeleteConfirmed
方法。
对于名称和签名相同的方法,另一个常用解决方法是手动更改 POST 方法的签名以包括额外(未使用)的参数。 这正是前面的文章中添加 notUsed
参数时进行的操作。 这里为了 [HttpPost] Delete
方法可以执行同样的操作:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
发布到 Azure
若要了解如何部署到 Azure,请参阅教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用。
打开电影控制器,并检查 Details
方法:
// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
创建此操作方法的 MVC 基架引擎添加显示调用方法的 HTTP 请求的注释。 在此情况下,它是包含三个 URL 段的 GET 请求,这三个段为 Movies
控制器、Details
方法和 id
值。 回顾这些在 Startup.cs
中定义的段。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
EF 可以使用 FirstOrDefaultAsync
方法轻松搜索数据。 该方法中内置的一个重要安全功能是,代码会先验证搜索方法已经找到电影,然后再执行操作。 例如,一个黑客可能通过将链接创建的 URL 从 http://localhost:{PORT}/Movies/Details/1
更改为类似 http://localhost:{PORT}/Movies/Details/12345
的值(或者不代表任何实际电影的其他值)将错误引入站点。 如果未检查是否有空电影,则应用可能引发异常。
检查 Delete
和 DeleteConfirmed
方法。
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie
.FirstOrDefaultAsync(m => m.Id == id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var movie = await _context.Movie.FindAsync(id);
_context.Movie.Remove(movie);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
请注意,HTTP GET Delete
方法不删除指定的电影,而是返回可在其中提交 (HttpPost) 删除的电影视图。 执行删除操作以响应 GET 请求(或者说,执行编辑操作、创建操作或更改数据的任何其他操作)会打开安全漏洞。
删除数据的 [HttpPost]
方法命名为 DeleteConfirmed
,以便为 HTTP POST 方法提供一个唯一的签名或名称。 下面显示了两个方法签名:
// GET: Movies/Delete/5
public async Task<IActionResult> Delete(int? id)
{
// POST: Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
公共语言运行时 (CLR) 需要重载方法拥有唯一的参数签名(相同的方法名称但不同的参数列表)。 但是,这里需要两个 Delete
方法 -- 一个用于 GET,另一个用于 POST -- 这两个方法拥有相同的参数签名。 (它们都需要接受单个整数作为参数。)
可通过两种方法解决此问题,一种是为方法提供不同的名称。 这正是前面的示例中的基架机制进行的操作。 但是,这会造成一个小问题:ASP.NET 按名称将 URL 段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。 该示例中也提供了解决方案,即向 DeleteConfirmed
方法添加 ActionName("Delete")
属性。 该属性对路由系统执行映射,以便包括 POST 请求的 /Delete/ 的 URL可找到 DeleteConfirmed
方法。
对于名称和签名相同的方法,另一个常用解决方法是手动更改 POST 方法的签名以包括额外(未使用)的参数。 这正是前面的文章中添加 notUsed
参数时进行的操作。 这里为了 [HttpPost] Delete
方法可以执行同样的操作:
// POST: Movies/Delete/6
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id, bool notUsed)
发布到 Azure
若要了解如何部署到 Azure,请参阅教程:在 Azure 应用服务中生成 ASP.NET Core 和 SQL 数据库应用。