首页 > 解决方案 > 路由 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> 吗?

标签: c#asp.net-mvcasp.net-core.net-coreasp.net-core-mvc

解决方案


由于您使用的是 ValidateAntiForgeryToken 您必须在视图中添加一个

<form method="post" action="DeletePost">
 @Html.AntiForgeryToken()

或从操作中删除此属性。

并修复您的 DeletePost 操作,因为您提交整个表单,输入参数应该是整个模型

[HttpPost]
[ValidateAntiForgeryToken] 
public IActionResult DeletePost(Expense model)
{
    var id=model.Id;
   ....
    
}

推荐阅读