为什么当我点击某一行的按钮,但继续传递第一行的值

时间:2017-01-24 04:34:03

标签: html asp.net-mvc vb.net

我想将值从所选行传递给控制器​​操作,以便将值作为会话传递。将值传递给控制器​​是有效的,但事实是,当我按下某一行的按钮时,它会继续传递第一行的值。我怎样才能让每一行的按钮分别传递行的值?

<form Class="form-horizontal" role="form" action="@Url.Action("Lookup", "home")" method="post">
    @For Each item In Model.Details
        @<tr Class="even gradeC">
            <td><input type="hidden" id="id" name="id" value="@item.id">@item.id</td>
            <td><input type="hidden" id="name" name="name" value="@item.name">@item.name</td>
            <td style="text-align: center; vertical-align: middle;"><Button type="submit" Class="btn btn-default" name="btnSelect" value="@item.id">Select</Button></td>
        </tr>
     Next
 </form>

这是在控制器中:

Function Lookup(btnSelect As String, id As String, name As String) As ActionResult
  If btnSelect.Equals(id) Then
     Session("id") = id
     Session("name") = name
  End If
End Function

| 1 |安娜|选择|

| 2 |贝拉|选择|

当我按下第2行的按钮时,它会传递值'1'和'Ana'。我已经尝试将id的值放到每个按钮来识别按钮,但似乎它仍然传递第一行的值,所有时间。

当我在断点期间查看值时,按钮的值是正确的 - '2'但'id'和'name'的值始终为'1'和'Ana'。我在这里失踪了什么?有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

您的<form>元素中有一个循环,在每次迭代中为您的隐藏输入生成重复的name属性(您有多个输入name="id"name="name"

单击提交按钮时,将发布所有输入的所有名称/值对,DefaultModelBinder仅读取具有匹配名称的第一个名称/值对,并忽略其余部分(除非参数为IEnumerable(Of String)在这种情况下,参数将包含所有值的集合。)

由于重复的id属性,您的代码也会生成无效的html。

您可以通过在每次迭代中生成新的<form>来解决此问题

@For Each item In Model.Details
    @<tr Class="even gradeC">
        <td>@item.id</td>
        <td>@item.id</td>
        <td>
            <form Class="form-horizontal" role="form" action="@Url.Action("Lookup", "home")" method="post">
                <input type="hidden" name="id" value="@item.id" />
                <input type="hidden" name="name" value="@item.name" />
                <button type="submit" class="btn btn-default">Select</button>
            </form>
        </td>
    </tr>
Next

请注意,id属性已被删除,并且该按钮中的namevalue属性已被删除。传递按钮的值没有任何意义,因为它的值为@item.id且您的If btnSelect.Equals(id) Then代码行始终返回True,这使得它毫无意义。你的控制器方法应该只是

Function Lookup(id As String, name As String) As ActionResult
    Session("id") = id
    Session("name") = name
    ....
End Function

附注:您并不真正需要隐藏的输入,您只需在表格action属性

中添加值作为路径或查询sting值即可
action="@Url.Action("Lookup", "home", New With { .id = item.id, .name = item.name })"