首页 - 通讯 - ASP.NET Core中文文档第二章指南(4.10)查看自动生成的Detail方法和Delete方法

ASP.NET Core中文文档第二章指南(4.10)查看自动生成的Detail方法和Delete方法

2023-10-05 14:21
-->

原文查看详情和删除方法

作者:里克·安德森

翻译谢阳(Kiler)

校对徐登阳(Seay)、姚阿勇(Mr.Yao)

打​​开Movie Controller并查看详细信息方法:

//获取:电影/详细信息/5
公共异步任务详细信息(int?id)
{
if (id == null)
{
return NotFound();
} var movie = wait _context.Movie.SingleOrDefaultAsync(m => www.gsm-guard.net == id);
if(电影==空)
{
return NotFound();
} 返回视图(电影);
}

创建此操作方法的 MVC 脚手架引擎添加了一个注释,给出了将调用此方法的 HTTP 请求。此示例中的 GET 请求包含三个 URL 段:Movies 控制器、Details 方法和id 参数值。查看 Startup 中定义的这些部分。

app.UseMvc(路线 =>
{
路线.MapRoute(
名称:“默认”,
template: "{controller=Home}/{action=Index}/{id?}");//手动高亮
});

Code First 模式使用 SingleOrDefaultAsync 方法使数据搜索更容易。此方法中包含的一个重要安全功能是确保在代码尝试对电影记录执行任何操作之前查找方法已找到电影记录。例如,黑客可以将生成的链接 URL 从 *http://localhost:xxxx/Movies/Details/1 * 更改为 *http://localhost:xxxx/Movies/Details/12345 *(或其他非实际电影记录值),导致网站出现错误。如果您不检查电影是否为空,应用程序将抛出异​​常。

查看删除方法和删除确认方法

//获取:电影/删除/5
公共异步任务删除(int?id)
{
if (id == null)
{
return NotFound();
} var movie = wait _context.Movie.SingleOrDefaultAsync(m => www.gsm-guard.net == id);
if(电影==空)
{
return NotFound();
} 返回视图(电影);
} // 发布:电影/删除/5
[HttpPost, ActionName("删除")]
[验证防伪令牌]
公共异步任务DeleteConfirmed(int id)
{
var movie = wait _context.Movie.SingleOrDefaultAsync(m => www.gsm-guard.net == id);
_context.Movie.Remove(电影);
等待_context.SaveChangesAsync();
return RedirectToAction("索引");
}

需要注意的是,HTTP GET Delete方法不会删除指定的电影,它返回一个可以提交(HttpPost)删除操作的Movie视图。响应 GET 请求而执行删除操作(或编辑、创建或任何其他更改数据的操作)将引入安全漏洞。

实际删除数据的[HttpPost]方法被命名为DeleteConfirmed,为该 HTTP POST 方法提供唯一的签名或名称。这两个方法的签名如下:

//获取:电影/删除/5
公共异步任务删除(int?id) // 发布:电影/删除/5
公共异步任务DeleteConfirmed(int id)

公共语言运行时 (CLR) 要求重载方法具有唯一的参数签名(相同的方法名称,但不同的参数列表)。但是,这里您需要两个 Delete 方法 - GET 请求和 POST 请求 - 并且它们都具有相同的参数签名。 (它们都需要接受一个整数作为参数)。

这个问题有两种解决方案,其中之一是给该方法起一个不同的名称。这就是上一个示例中脚手架机制所做的事情。但是,这种方法引入了一个小问题:www.gsm-guard.net 使用名称将 URL 段映射到操作方法,如果重命名方法,路由器通常无法找到该方法。解决方案如示例中所示,即将 ActionName("Delete") 属性添加到 DeleteConfirmed 方法。此功能为路由系统执行映射,因此对包含 /Delete/ 的 URL 的 POST 请求将找到 DeleteConfirmed 方法。

对于具有相同名称和参数签名的方法,另一个常见的解决方案是人为更改 POST 方法的签名以包含额外的(未使用的)参数。这是我们在上一篇文章中添加的unused的参数。这里您可以将相同的解决方案应用于[HttpPost]删除方法:

// POST:电影/删除/5
[HttpPost]
[验证防伪令牌]
公共异步任务删除(int id,bool notUsed)
{
var movie = wait _context.Movie.SingleOrDefaultAsync(m => www.gsm-guard.net == id);
_context.Movie.Remove(电影);
等待_context.SaveChangesAsync();
return RedirectToAction("索引");
}

返回目录

-->