Почему asp-route-id не работает в моем сообщении формы?

У меня asp-route-id работает в одном экземпляре:

Он работает с тегом привязки следующим образом:

<a id="editModal" data-toggle="modal" data-target="#modal_box"
    class="btn btn-sm btn-primary"
    asp-action="Edit" asp-route-id="@user.Id">Edit</a>

и принимается так:

public async Task<PartialViewResult> DeleteConfirm(string Id) =>
        PartialView("_DeleteConfirm", await _userManager.FindByIdAsync(Id));

Этот метод получает правильный идентификатор.

В следующем примере идентификатор маршрута в теге формы выглядит следующим образом:

<div class="modal-footer">
    <form asp-controller="Account" asp-action="Delete" asp-route-id="@Model.Id" method="post">
        <button type="submit" class="btn btn-primary"
           asp-action="Delete">Yes - Delete this User</button>
        <a asp-action="Index" class="btn btn-default">Cancel</a>
    </form>
</div>

и я пытаюсь получить идентификатор здесь:

    [HttpPost]
    public async Task<IActionResult> Delete(string Id)
    {
        AppUser user = await _userManager.FindByIdAsync(Id);
        if (user != null)
        {
            IdentityResult result = await _userManager.DeleteAsync(user);
            if (result.Succeeded)
            {
                return RedirectToAction("Index");
            }
            else
            {
                AddErrorsFromResult(result);
            }
        }
        else
        {
            ModelState.AddModelError("", "User Not Found");
        }
        return View("Index", _userManager.Users);
    }

Но в этом случае параметр имеет значение null.

Это должно работать из тега from. Я взял это из первой главы Identity Chapter в книге Adam Freemans APress MVC Core, и это сработало, когда я набрал его для этого примера.


person Sam    schedule 13.03.2017    source источник
comment
Вы проверили форму, которая была сгенерирована в HTML? Либо указан неверный URL-адрес действия, либо привязка модели не работает. Обычно параметр будет называться id вместо Id.   -  person juunas    schedule 13.03.2017
comment
хороший призыв к соглашению об именах. Спасибо. Хотя все еще пытаюсь исправить.   -  person Sam    schedule 13.03.2017


Ответы (2)


Вы должны изменить asp-route-id на asp-route-Id, потому что после asp-router- вы должны указать имя параметра, который вы собираетесь отправить в метод.

person Alexander Díaz    schedule 27.03.2020

Я проверил тег формы в ответ на комментарии junnas.

Это выглядело так:

<form method="post" action="/Account/Delete/5066a97b-7eb4-4e1d-889b-3f3450adc1d6">
        <button type="submit" class="btn btn-primary" formaction="/Account/Delete">Yes - Delete this User</button>
        <a class="btn btn-default" href="/Account">Cancel</a>
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8At6yzynfgJHstUkF5jJTYgHHX0on9ajBa9NfD60YGbM7aRhKjDQUGkh4gPAMkwwOsnqUtDxSx87MnUvbxcefB7tGX1v0Xi38h_SoL_iakiFdJSpUbymp4tsr-cMFNK3kwYx7o42OumLkFbvFn1Nyun_8LDc0mmOvGN5LeeHiIq84cSJCaaiyR_2talw6Dpcvw" /></form>

Обратите внимание на дополнительное право formaction="/Account/Delete"> на кнопке в дополнение к действию формы.

У меня остался лишний asp-route-id на кнопке, которую я сменил с привязки.

Пришлось снимать кнопку вот здесь:

<form asp-controller="Account" asp-action="Delete" asp-route-id="@Model.Id" method="post">
        <button asp-route-id="@Model.Id" type="submit" class="btn btn-primary">Yes - Delete this User</button>
        <a asp-action="Index" class="btn btn-default">Cancel</a>
    </form>

и сделать кнопку вот так:

Да - удалить этого пользователя

person Sam    schedule 13.03.2017