c# - 路由 ASP.NET Core 的问题
问题描述
我正在尝试了解 MVC 和 ASP.NET Core。我有一个与数据库交互的小项目。我可以将条目插入数据库,但是当我尝试删除它们时,我的路由似乎搞砸了。
我有一个带有两种删除方法的“费用”控制器:
//GET-delete
//When we do a delete, show the item deleted
[HttpGet]
public IActionResult Delete(int? id)
{
if (id == null || id == 0)
{
return NotFound();
}
var obj = _db.Expenses.Find(id);
if (obj == null)
{
return NotFound();
}
return View(obj);
}
//POST-delete
//Interact with the database to delete the row with the desired ID
[HttpPost]
[ValidateAntiForgeryToken] //only executes if the user is actually logged in.
public IActionResult DeletePost(int? id)
{
var obj = _db.Expenses.Find(id);
if (obj == null)
{
return NotFound();
}
_db.Expenses.Remove(obj);
_db.SaveChanges();
return RedirectToAction("Index"); //this calls up the Index action in the same controller, to show the table again
}
我的索引视图将我带到删除视图,如下所示:
<a asp-area="" asp-controller="Expense" asp-action="Delete" class="btn btn-danger mx-1" asp-route-Id="@expense.Id">Delete expense</a>
我可以看到我要删除的条目(https://localhost:44388/Expense/Delete/1),但是当我单击删除按钮时,我被定向到 https://localhost:44388/Expense/Delete/ DeletePost 当我应该(我认为)被发送到 https://localhost:44388/Expense/DeletePost/1。结果是浏览器显示 HTTP 405 错误。
Delete.cshtml 看起来像这样:
@model InAndOut.Models.Expense
<form method="post" action="DeletePost">
<input asp-for="Id" hidden>
<div class="border p-3">
...html stuff
<div class="form-group row">
<div class="col-8 text-center row offset-2">
<div class="col">
<input type="submit" class="btn btn-danger w-75" value="Delete" />
</div>
<div class="col">
<a asp-action="Index" class="btn btn-success w-75">Back</a>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
Startup.cs 具有以下路由定义:
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
知道我在这里做错了什么吗?Delete.cshtml 中的提交按钮不应该将 ID 发送到 Expense/DeletePost/<id> 吗?
解决方案
由于您使用的是 ValidateAntiForgeryToken 您必须在视图中添加一个
<form method="post" action="DeletePost">
@Html.AntiForgeryToken()
或从操作中删除此属性。
并修复您的 DeletePost 操作,因为您提交整个表单,输入参数应该是整个模型
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult DeletePost(Expense model)
{
var id=model.Id;
....
}
推荐阅读
- javascript - 使用一个文件夹中的所有文件,就像一个大 JS
- python - HTML:使用python自动生成的电子邮件中的文本颜色
- python - 如何使用 matplotlib 以图形形式显示结果?
- javascript - Jquery 验证器移动输入字段
- javascript - javascript私有方法中的符号和弱映射有什么区别?
- mysql - TypeORM - 如何在生产模式下创建新表并自动运行迁移?
- python - Python字符串被多个分隔符分割
- include - 我可以使用 \input{file.tex} 或类似方法将 LaTeX 文件中的内容(不是整个文档)有效地带入 Jupyter 笔记本吗?
- php - 仅在使用静态方法时,如何在 Symfony 中修复“您是否忘记了“使用”语句 [...]?
- html - 为什么图片不会出现在 WordPress 网站的版权部分?