.NET Core应用 检查Details和Delete方法

  1. 检查 Details方法:

    路径 :MvcMovie\Controllers\MoviesController.cs

    创作此操作方法的MVC基架引擎添加显示调用方法的HTTP请求的注释。

    在此情况下,他是包含三个URL段的GET请求,这三个段为 Movies控制器、Details方法和id值。

    可以回顾下载program.cs中定义的段:      

      app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");

    EF可以使用FirstOrDefaultAsync方法轻松搜索数据。该方法中内置的一个重要安全功能是:

      代码会先验证搜索方法已找到电影,然后在操作。

  2. 检查Delete和DeleteConfirmed方法:

    路径 :MvcMovie\Controllers\MoviesController.cs

    注意 : 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段映射到操作方法,如果重命名方法,则路由通常无法找到该方法。

        解决该问题的方法:特性中添加属性ActionName("Delete") 例 :[HttpPost, ActionName("Delete")]

                 该属性对路由系统执行映射,以便包括POST请求的/Delete/的URL可以找到DeleteConfirm方法。

      ②.  手动更改POST方法的签名以包括额外(未使用)的参数。例 (新增了notUsed无用参数):

        // POST: Movies/Delete/6

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Delete(int id, bool notUsed)

posted @ 2022-07-11 15:29  大师兄被妖怪抓走了  阅读(102)  评论(0编辑  收藏  举报