Параметр для метода обработчика страницы бритвы всегда получает одно и то же значение - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть страница бритвы, которая отображает коллекцию сущностей в таблице.Есть кнопка удаления с именованным методом-обработчиком, который должен удалять элемент из коллекции по его идентификатору.Проблема не в том, какую строку я удаляю удалить в верхней части Журнал / строка всегда удаляется.Когда я ставлю точку останова для отладки в методе обработчика, значение параметра LogId всегда одинаково (идентификатор журнала в верхней части таблицы).

.cshtml

<tbody>
    @foreach (var item in Model.Client.Logs.ToList())
    {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.TrnType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TrnDte)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TrnAmount)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            <input type="hidden" name="LogId" value="@item.LogId" />
            <input onclick="return confirm('Are you sure you want to delete this?')" type="submit" class="btn btn-sm btn-danger" asp-page-handler="DeleteTransaction" value="Delete" />
        </td>
    </tr>
    }
</tbody>

.cshtml.cs

public async Task<IActionResult> OnPostDeleteTransactionAsync(int? LogId)
{
    //LogId always has the value of the Id from the first Log in the table
    //Delete log
}

1 Ответ

0 голосов
/ 21 сентября 2019

Позвольте мне привести вам наглядный пример.

Скажите, что ваш Model.Client.Logs содержит 2 элемента.

<tbody>
    @foreach (var item in Model.Client.Logs.ToList())
    {
    <tr>
        <td>
            <input type="hidden" name="LogId" value="@item.LogId" />
            <input onclick="return confirm('Are you sure you want to delete this?')" type="submit" class="btn btn-sm btn-danger" asp-page-handler="DeleteTransaction" value="Delete" />
        </td>
    </tr>
    }
</tbody>

В результате вы получите

<tr>
    <td>
        <!-- First element named "LogId" -->
        <input type="hidden" name="LogId" value="123" />
        <input type="submit" asp-page-handler="DeleteTransaction" name="LogId" value="Delete" /> 
    </td>
</tr>
<tr>
    <td>
        <!-- Second element named "LogId" -->
        <input type="hidden" name="LogId" value="456" />
        <input type="submit" asp-page-handler="DeleteTransaction" name="LogId" value="Delete" /> 
    </td>
</tr>

Вы нажимаете на удаление во втором ряду.Теперь метод pagehandler будет искать html-элемент с именем LogId, который будет принимать его значение.

Но есть 2 элементов с именем LogId (не считая кнопок удаления).

Обработчик просматривает ваш DOM построчно, пока не обнаружит, что нашел то, что искал.Первый элемент с именем LogId.Отлично, теперь он может перестать смотреть.

Он нашел значение и возвращает его действию.Вот почему ваш код не работает и почему он возвращает первое найденное значение, потому что он не знает, что на самом деле есть еще элементы с именем LogId.И даже тогда он не будет знать, какой из них вы выбрали.

...