0

次のRazorビューが表示され、HDDのリストが表示されるので、ユーザーがカートに追加します。ユーザーがHDDの各行の横にあるボタンを押すと、数量とHDDのIDがコントローラーに渡されます。ただし、各HDDのIDは正しく表示されますが、コントローラーのパラメーターを調べると、「hddId」は常に1であり、「quantity」は正しく5です。

@model IEnumerable<TestStore.Models.Hdd>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using(Html.BeginForm("AddToCart","Cart")){
<table>
    <tr>
        <th>
            Ident
        </th>
        <th>
            Brand
        </th>
        <th>
            Name
        </th>
        <th>
            Model
        </th>
        <th>
            Speed
        </th>
        <th>
            Capacity
        </th>
        <th>
            Cache
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.hddId)
        </td>
        <td>
            @Html.Hidden("hddId", item.hddId)
            @Html.Hidden("quantity", 5)
            @Html.DisplayFor(modelItem => item.brand)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.model)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.speed)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.capacity)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.cache)
        </td>
        <td>
            <input type="submit" value="Add to Cart" />
        </td>
    </tr>

}

</table>
}
4

3 に答える 3

0

Codingbizは正しいです。送信ボタンは特定の行ではなく、テーブル全体を参照していました。「hddId」が常に「1」であった理由は、フォームが送信されたときに表示される「hddId」の最初の参照であるためだと思います。@using(Html.BeginForm(...))が@foreachループ内にあるように変更したので、各行には独自のフォームと送信ボタンがあります。

@foreach (var item in Model) {

    <tr>
        @using(Html.BeginForm("AddToCart","Cart")){
        <td>
            @Html.DisplayFor(modelItem => item.hddId)
        </td>
        <td>
            @Html.Hidden("hddId", item.hddId)
            @Html.Hidden("quantity", 5)
            @Html.DisplayFor(modelItem => item.brand)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.model)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.speed)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.capacity)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.cache)
        </td>
        <td>
            <input type="submit" value="Add to Cart" />
        </td>
        }
    </tr>
}
于 2012-09-23T07:19:45.077 に答える
0

input type="submit" の代わりに button type="submit" を使用して、検証の問題を回避しました。ID番号をコントローラーに渡すことで、引き続き正しく機能します。

@using(Html.BeginForm("AddToCart","Cart")){
<table>
    <tr>
    //header stuff here
    </tr>

    @foreach (var item in Model) {
    //row data goes here
    //remove hidden field reference to @item.hddId
    <tr>
    <td>
        <button type="submit" value="@item.hddId" name="hddId">Add to Cart</button>
    </td>
    </tr>
</table>
}
于 2012-09-26T16:41:44.417 に答える
0

他の人が言ったように、送信すると、クリックされた行だけでなく、テーブルのすべての行が送信されるため、これは機能しません。

1 つのオプションは、この記事で提案されていることを実行することです。

http://federmanscripts.com/2010/01/12/form-and-table-row-nesting-workaround/

つまり、javascript を使用して、ボタンを押したときにフォームの値を非表示の行にコピーして送信します。

于 2012-09-23T07:40:47.287 に答える