C# razor页面处理程序方法的参数始终获取相同的值

C# razor页面处理程序方法的参数始终获取相同的值,c#,razor,C#,Razor,我有一个razor页面,在表中显示实体集合。有一个带有命名处理程序方法的delete按钮,该方法应该根据项的Id从集合中删除该项。问题是,无论我在顶部日志/行中单击delete的是哪一行,都会被删除。当我在handler方法上放置一个断点进行调试时,LogId参数的值总是相同的(表顶部的日志Id) .cshtml <tbody> @foreach (var item in Model.Client.Logs.ToList()) { <tr>

我有一个razor页面,在表中显示实体集合。有一个带有命名处理程序方法的delete按钮,该方法应该根据项的Id从集合中删除该项。问题是,无论我在顶部日志/行中单击delete的是哪一行,都会被删除。当我在handler方法上放置一个断点进行调试时,LogId参数的值总是相同的(表顶部的日志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>

@foreach(Model.Client.Logs.ToList()中的var项)
{
@DisplayFor(modelItem=>item.TrnType)
@DisplayFor(modelItem=>item.TrnDte)
@DisplayFor(modelItem=>item.TrnAmount)
@DisplayFor(modelItem=>item.Description)
}
.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
}
PostDeleteTransactionSync(int?LogId)上的公共异步任务 { //LogId始终具有表中第一个日志的Id值 //删除日志 }
让我给你一个直观的例子

假设您的Model.Client.log包含2项


@foreach(Model.Client.Logs.ToList()中的var项)
{
}
其结果将是输出


单击第二行的delete。 现在,pagehandler方法将查找一个名为LogId的html元素以获取其值

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

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


它已找到值并将其返回给操作。这就是为什么您的代码不起作用,为什么它返回它找到的第一个值,因为它不知道实际上有更多名为LogId的项。即使这样,它也不知道您选择了哪一行。

因此,当表中有100行,有100个名为LogId的隐藏输入字段和100个删除按钮时,代码如何知道要获取哪一行?仅仅因为你的删除按钮靠近输入字段?那会很奇怪。您的删除按钮上需要有一个属性
asp route id=“@item.LogId”
例如,您的按钮可以向控制器操作发送正确的ID。@Dennis1679 handler方法参数应该知道要获取哪个值,因为我认为参数名必须与表单字段名匹配,才能自动绑定到该值。在我的例子中,value=@item.LogIdMy输入表单字段的名称为LogId,处理程序方法的参数名为LogId。“我的输入表单”字段正在使用名称LogId和value=”“属性的正确不同LogId值进行呈现。但是,当我到达断点时,我的参数值始终是第一个LogId。忘记value属性。您需要将asp路由id=“@item.LogId”添加到输入中,如下所示
@Dennis1679我删除了隐藏的输入,并添加了asp路由id,它就可以工作了。但是,您可以通过表单输入和路由将参数传递给处理程序方法。。。我知道它是有效的,但我想知道为什么通过输入传递我的参数无效添加和删除隐藏的输入是有效的。附加到asp路由的名称-需要与处理程序方法中的参数同名。