剃刀页面处理程序方法的参数始终获得相同的值

时间:2019-09-20 21:42:39

标签: c# razor

我有一个剃须刀页面,在表格中显示实体的集合。有一个带有命名处理程序方法的删除按钮,该按钮应通过其ID从集合中删除该项目。问题是无论我在顶部点击删除的哪一行,日志/行总是被删除。当我在处理程序方法上放置一个断点进行调试时,LogId参数的值始终是相同的(表顶部的Log的ID)。

.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 :(得分:0)

让我给你一个直观的例子。

说您的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方法将查找名称为LogId的html元素以获取其值。

但是但是有 2 个元素,它们的名称为 LogId (不包括删除按钮)。

处理程序逐行遍历您的DOM,直到发现找到了要查找的内容为止。第一个元素名为LogId。太好了,现在它可以停止寻找了。

它找到了值,并将其返回到操作。这就是为什么您的代码不起作用以及为什么它返回找到的第一个值的原因,因为它不知道实际上还有更多名为LogId的项。即便如此,它也不知道您选择了哪一个。