路由问题 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;
   ....
    
}