簡體   English   中英

不正確的 Model.ID 被傳遞到 MVC 中從視圖中刪除操作

[英]Incorrect Model.ID being passed to Delete Action from View in MVC

我正在使用一個名為“編輯”的 MVC 操作 controller 來允許我編輯、創建或復制記錄。 但是,當我嘗試刪除記錄時,此操作的視圖 model 不會一致地提交 Model ID。 這是調用刪除操作的按鈕。

    <input class="btn btn-info btn-danger" asp-controller="Bags" asp-action="Delete" asp-route-id="@Model.Id" onclick="alert(@Model.Id);" type="submit" value="Yes" />

那行代碼讓我可以刪除 Edited 或 Created 記錄,但是當我嘗試刪除新復制的記錄時,傳遞給 Delete 操作的 ID 是原始記錄的 ID,而不是復制的記錄。

這是創建/編輯/復制記錄並調用視圖的編輯操作的代碼。

        // GET: Bags/Edit/5
        [HttpGet]
        public async Task<IActionResult> Edit(int? id, bool? copy)
        {
            Bagsmvc bag = new Bagsmvc();
            ViewBag.Copy = false;

            // When id is not null, we are editing or copying.  Otherwise, we're creating 
            // EDIT a bag
            if(id != null)
            {
                bag = await _db.Bags.FirstOrDefaultAsync(x => x.Id == id);
            } else
            // CREATE a new blank bag
            {
                await _db.Bags.AddAsync(bag);
                await _db.SaveChangesAsync(); ;
            }

            // COPY a bag
            // This is a real hack.  Once the button is hit, the bag is copied and saved to the db.  Setting Id = 0 somehow
            // indicates to the Entity Framework to add the record in with a newly generated ID.  
            // Also, since we don't want an exact copy, bring user to edit screen to make the changes.
            if (copy != null)
            {
                ViewBag.Copy = true;
                bag.Id = 0;
                await _db.Bags.AddAsync(bag);
                await _db.SaveChangesAsync(); ;
            }

            return View(bag);
        }

現在這里有一些屏幕截圖,您可以在其中看到行李編號在視圖中是正確的。 但是當我提交“是”時,調試器確認舊 ID 號已傳遞給刪除操作。
啟動副本

我單擊“復制包”以獲取舊記錄 #3079。 代碼創建了新項目#3088,我將刪除它。

新建記錄#3088

我確認刪除,並且刪除操作認為我正在刪除原始記錄(調試器中的 id = 3079)而不是副本 3088(這是 @Model.Id 應該綁定的)

調試器顯示 ID 為 3079(復制自的記錄)

知道發生了什么嗎?

好的,我想出了如何解決它,但我仍然不知道為什么會出現問題。 這個問題是由我沒有發布的代碼造成的。 在前面的 View model 代碼中,帶有刪除按鈕的表單有以下幾行:

<h1>ID: @Model.Id</h1>
<input type="hidden" asp-for="@Model.Id" />

出於某種原因,h1 @Model.Id 設置為 3088,但隱藏按鈕不知何故仍綁定到 3079。為什么要這樣做? 我錯過了什么?

作為一種解決方法,我消除了復制操作的隱藏字段,以便使用 asp-route-id

<h1>ID: @Model.Id</h1>
@if (ViewBag.Copy == false)
    {
        <input type="hidden" asp-for="@Model.Id" />
    }

...

<input class="btn btn-info btn-danger" asp-controller="Bags" asp-action="Delete" asp-route-id="@Model.Id" type="submit" value="Yes" />

如果有人對此有所了解,我很想知道為什么 Model 在隱藏字段中綁定不正確。 是否有一些我不知道的奇怪的持久性正在發生?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM