首页 > 解决方案 > HttpPost 模型 ID 始终为 0

问题描述

我有一个更新页面,其中包含一个包含我的模型的 ViewModel。当我将它加载到页面时,一切正常,但是当我提交更改时,我的模型 ID始终为0,我的意思是LITTERALY ALWAYS。我正在学习一个教程,我完全按照他的做法做了,但仍然是0。

这是我在参数中传递 VM 的 POST 方法。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Update(ExpenseVM obj)
    {
        if (ModelState.IsValid)
        {
            _db.Expenses.Update(obj.Expense);
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(obj);
    }

这是我的 ID 的 HTML/C# 代码

<input type="hidden" asp-for="Expense.Id" value="@Model.Expense.Id" name="Id"/>

当我加载我的页面时,我的 ID 已加载并且一切正常。在调试期间,这就是我的 HTML 中的内容:

<input type="hidden" value="1" name="Id" data-val="true" data-val-required="The Id field is required." id="Expense_Id">

标签: c#asp.netasp.net-mvc

解决方案


我发现了为什么它不起作用。

我的 HTML 是这样的

<form method="post" asp-action="Update">
   <div class="border p-3">
      <div class="form-group row">
         <h2 class="text-black-50 pl-3">Update Expense</h2>
      </div>
      <div class="row">
         <input type="hidden" asp-for="Expense.Id" value="@Model.Expense.Id" name="Id"/>
         <div class="col-12">
            ... BLABLABLA
         </div>
      </div>
   </div>
</form>

所以我只是将输入行从内部<div class="row>移到<form method="post" asp-action"Update">并删除了所有这些无用的标签,例如name="Id" value="@Model.Expense.Id" type="hidden"

现在看起来就像这样

<form method="post" asp-action="Update">
   <input asp-for="Expense.Id" hidden/>
   <div class="border p-3">
      <div class="form-group row">
         <h2 class="text-black-50 pl-3">Update Expense</h2>
      </div>
      <div class="row">
         <div class="col-12">
            ... BLABLABLA
         </div>
      </div>
   </div>
</form>

它工作正常。

现在请不要问我为什么,因为我不知道,但如果有人回答为什么?我全是耳朵。


推荐阅读