Неправильный Model.ID передается для удаления действия из представления в MVC - PullRequest
0 голосов
/ 03 мая 2020

Я использую один MVC контроллер действий, называемый «Редактировать», чтобы позволить мне редактировать, создавать или копировать записи. Однако модель View для этого действия не передает идентификаторы модели последовательно, когда я пытаюсь удалить записи. Вот кнопка, которая вызывает действие удаления.

    <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" />

Эта строка кода позволяет мне удалить отредактированную или созданную запись, но когда я пытаюсь удалить вновь скопированную запись, идентификатор, который передается на удаление action - это идентификатор исходной записи, а не скопированной записи.

Вот код действия редактирования, которое создает / редактирует / копирует записи и вызывает представление.

        // 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);
        }

Now Вот несколько снимков экрана, на которых видно, что номер мешка верен на виде. Но когда я отправляю «Да», отладчик подтверждает, что старый идентификатор передается действию удаления.
Initiate the copy

Я нажимаю «Копировать сумку» для старой записи # 3079. Код создает новый элемент # 3088, который я собираюсь удалить.

Newly created record #3088

Я подтверждаю удаление, и каким-то образом действие Удалить считает, что я удаляю исходная запись (id = 3079 в отладчике), а не копия 3088 (к чему должен быть привязан @ Model.Id)

Debugger shows ID as 3079 (the record copied from)

Любая идея, что происходит?

1 Ответ

0 голосов
/ 03 мая 2020

ОК, я понял, как это исправить, но я все еще не знаю, почему это было проблемой. Проблема была создана кодом, который я не опубликовал. Ранее в коде модели View форма с кнопкой «Удалить» имела следующие строки:

<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" />

Если у кого-то есть понимание к этому, я хотел бы знать, почему Модель неправильно связывается в скрытом поле. Происходит ли какое-то странное упорство, о котором я не знаю?

...