2017-01-24 6 views
2

値がセッションとして渡されるように、選択した行の値をコントローラアクションに渡したいとします。コントローラーへの値渡しは機能していますが、ある行のボタンを押すと、最初の行の値を渡し続けます。各行のボタンがそれぞれ行の値を渡すようにするにはどうすればよいですか?なぜ特定の行のボタンをクリックしても、最初の行の値を渡し続ける場合

<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

:あなたのコントローラメソッドは、ちょうど

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

サイドノートでなければなりませんあなたが示しているコードはそれをしませんので、私はあなたがいくつかのjavascriptを持っている必要があると仮定します。 (そして 'FormMethod.Post'は' Url.Action() 'なので、それを削除しても意味がありません)。そしてそのコードは明らかにあなたの無効なhtml(重複した 'id'属性)を生成することを意味するループ内にあります。 –

+0

@StephenMuecke大丈夫、ありがとう。 javascriptを使わずに値を渡す方法はありますか?私はそこにいくつかのものをスキップした、私は私の質問を更新しました – Nurul

+0

これのために任意のJavaScriptを必要としません。しかし、あなたのコードは意味をなさない。あなたが持っているのは、編集できない隠された入力だけです。これで何を達成しようとしているのですか?(単一のフォーム内に同じ名前の複数の入力があり、 'DefaultModelBinder'は最初の値をバインドして残りを無視するためです) –

答えて

1

あなたは(あなたがname="id"name="name"で複数の入力を持つ)各反復であなたの隠された入力に対するname属性を複製生成しているあなたの<form>要素内のループを持っています。

送信ボタンをクリックすると、すべての入力のすべての名前と値のペアが送信され、DefaultModelBinderは一致する名前の最初の文字のみを読み取り、残りの文字は無視します(パラメータがIEnumerable(Of String)の場合を除きます)。すべての値の集合を含む)。

また、id属性が重複しているため、無効なhtmlが生成されています。

あなたはid属性が削除されていることを各反復

@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 

注新しい<form>、および削除されたボタンからnamevalue属性を生成することによって、この問題を解決することができます。値が@item.idで、If btnSelect.Equals(id) Thenコード行が常にTrueを返すので、ボタンの値を返すことは意味がありません。あなたは本当に隠された入力を必要としない、とあなたは、単にフォーム内のルートまたはクエリ刺す値として値を追加することができますaction属性

action="@Url.Action("Lookup", "home", New With { .id = item.id, .name = item.name })" 
+0

できません1エラー:1) "要素 'フォーム'は要素 'tbody'内に入れ子にできません"。 – Nurul

+0

初心者の方でも(私はVBを15年間使用していないほとんどの人のように)確信していますが、正しい構文を理解できると確信しています。あなたはあなたの質問に 'tbody'を表示しませんでしたが、フォームを'​​'要素の中に入れてください。私に5分与えてください。そのビットを更新します。 –

+0

すみません。私はそれをシンプルに保つために努力していました。 – Nurul

関連する問題