我想将值从所选行传递给控制器操作,以便将值作为会话传递。将值传递给控制器是有效的,但事实是,当我按下某一行的按钮时,它会继续传递第一行的值。我怎样才能让每一行的按钮分别传递行的值?
<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'。我在这里失踪了什么?有人可以帮我吗?
答案 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
属性已被删除,并且该按钮中的name
和value
属性已被删除。传递按钮的值没有任何意义,因为它的值为@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
属性
action="@Url.Action("Lookup", "home", New With { .id = item.id, .name = item.name })"