首页 > 解决方案 > 相同的参数和方法名称,控制器如何在 ASP.NET Core MVC 中找到调用哪一个

问题描述

我正在关注 Microsoft 网站https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/details?view=aspnetcore-2.2上发布的教程

我只是想知道一旦我单击删除按钮,它怎么知道应该首先调用哪个方法或操作?获取或发布?具有相同的参数和动作名称 下面的代码可能会向您显示更多详细信息。

谢谢

 // 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));
        }

标签: asp.netasp.net-mvc

解决方案


如上面评论中所述,GET 请求通常会返回一个 View 来执行操作,但除非它是 POST 请求,否则它实际上不会执行该操作,例如,对名为 Edit 的操作的 GET 请求将获取数据到编辑并显示它。而已。在提交到 Edit 操作的 POST 之前,这些更改不会保存到数据库中。

重载的方法需要具有不同的参数签名。由于 CRUD 操作的其他脚手架对(删除除外)具有不同的签名,因此它们可以具有相同的名称。但由于 Delete 操作的 GET 和 POST 方法具有相同的参数签名,因此需要重命名其中之一,这就是 POST 操作被命名为 DeleteConfirmed 的原因。但是,让 GET 和 POST 方法命名不同会破坏 MVC 中内置的路由。添加 ActionName("Delete") 属性可以解决这个问题。


推荐阅读