路由问题 ASP.NET 核心
Trouble with routing 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/ 吗?
由于您使用的是 ValidateAntiForgeryToken,因此您必须在视图中添加一个
<form method="post" action="DeletePost">
@Html.AntiForgeryToken()
或从操作中删除此属性。
并修复您的 DeletePost 操作,因为您提交了整个表单,输入参数应该是整个模型
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult DeletePost(Expense model)
{
var id=model.Id;
....
}
我正在尝试学习 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/
由于您使用的是 ValidateAntiForgeryToken,因此您必须在视图中添加一个
<form method="post" action="DeletePost">
@Html.AntiForgeryToken()
或从操作中删除此属性。
并修复您的 DeletePost 操作,因为您提交了整个表单,输入参数应该是整个模型
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult DeletePost(Expense model)
{
var id=model.Id;
....
}