asp.net - 相同的参数和方法名称,控制器如何在 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));
}
解决方案
如上面评论中所述,GET 请求通常会返回一个 View 来执行操作,但除非它是 POST 请求,否则它实际上不会执行该操作,例如,对名为 Edit 的操作的 GET 请求将获取数据到编辑并显示它。而已。在提交到 Edit 操作的 POST 之前,这些更改不会保存到数据库中。
重载的方法需要具有不同的参数签名。由于 CRUD 操作的其他脚手架对(删除除外)具有不同的签名,因此它们可以具有相同的名称。但由于 Delete 操作的 GET 和 POST 方法具有相同的参数签名,因此需要重命名其中之一,这就是 POST 操作被命名为 DeleteConfirmed 的原因。但是,让 GET 和 POST 方法命名不同会破坏 MVC 中内置的路由。添加 ActionName("Delete") 属性可以解决这个问题。
推荐阅读
- python - 使用 Seaborn 绘制嵌套的多箱图
- reactjs - 使用带有嵌套 MenuItem 的 Material Ui 的 Redux Form 不起作用
- java - 加载 youtube 视频时出错:未知的 youtube 活动
- postgresql - 查询以检查凭据是否已存在的正确方法
- python - 图像 + 浮点数组作为 Keras 模型中的输入
- reactjs - React Hook - tsx 和无类型数组
- python - 实例化自定义结构化 dtype 的标量
- python - AttributeError:“NoneType”对象没有属性“conId”
- python - Python Django 文件字段 404
- typescript - 在 Visual Studio Code Extension API 中是否有在运行时获取 OS 平台的 API?