0

売り手のコレクションを持つビュー モデルの部分ビューがあります。リストをレンダリングするために、すべてのセラーをループします。ビューモデルは次のとおりです。

public class SellersPartialViewModel
{
    public IList<OrderViewModel> Sellers { get; set; }
}

部分ビューでは、コレクションをループするときに Html.BeginCollectionItem("Sellers") を使用しています。これが部分ビューのコードです (参考までに、表示する必要のない多くの役に立たないコードを削除しました)。 ):

<div id="sellers-list">
    @{
        var i = 0;
        while (i < Model.Sellers.Count) { 
            var seller = Model.Sellers[i];

                using (Ajax.BeginForm(MVC.Video.PurchaseShares(), purchaseSharesAjaxOptions, new { @class = "seller-form", id = "seller-form-" + i })) {
                    @using(Html.BeginCollectionItem("Sellers")) {
                        @Html.TextBoxFor(m => seller.Qty, new { @class = "buyer-qty" })
                        @Html.ValidationMessageFor(m => seller.Qty)

                       <input class="buyer-qty-submit" name="Qty" type="hidden" value="" />
                       <button type="submit">Buy</button>
                    }
                }
            }

            i++;
        }
    }
</div>

これは、パーシャルをレンダリングしてクライアント側の検証を機能させるのに問題なく機能しますが、各売り手に名前の付いた入力qtyorderId、というコントローラーアクションを持たせたいですPurchaseShares(int orderId, int qty)

唯一の問題は、フォームが奇妙な GUID で送信されSellers[5b5fd3f2-12e0-4e72-b289-50a69aa06158].seller.Qtyていることです。これは、コレクションの送信には正しいと理解していますが、それを行う必要はありません。

現在、選択したもので更新するJavascriptがいくつかあり、class="buyer-qty"正常に動作しますが、これを行うためのより良い方法が必要ですよね?

ありがとう

4

1 に答える 1

1

Html.BeginCollectionItemコレクションを送信したくないのに、なぜヘルパーを使用しているのですか?

_Order.cshtmlOrder コレクション項目 ( )を表すパーシャルを持つことができます。

@model OrderViewModel

@Html.TextBoxFor(m => m.Qty, new { @class = "buyer-qty" })
@Html.ValidationMessageFor(m => m.Qty)

メイン ビューでは、コレクション プロパティをループして、各要素のパーシャルをレンダリングします。

@model SellersPartialViewModel

<div id="sellers-list">
    @foreach (var seller in Model.Sellers)
    {
        using (Ajax.BeginForm(MVC.Video.PurchaseShares(), purchaseSharesAjaxOptions, new { @class = "seller-form" }))
        {
            @Html.Partial("_Order", seller)
            <button type="submit">Buy</button>
        }
    }
</div>

これで、送信先のコントローラー アクションは、対応するビュー モデルで直接動作する可能性があります。

[HttpPost]
public ActionResult PurchaseShares(OrderViewModel order)
{
    ...
}

なぜなら:

[HttpPost]
public ActionResult PurchaseShares(int orderId, int qty)
{
    ...
}

私にはちょっと醜く見えますが、あなたがそれを好むならそれもうまくいくでしょう.

Qtyまた、同じ名前の入力要素と競合するため、コードに表示されている隠しフィールドを意図的に削除したことに注意してください。orderIdまた、コントローラー アクションが期待する引数の入力フィールドを含めることを忘れないでください。入力フィールドとして含めたくない場合routeValuesは、ヘルパーの引数の一部として送信することもできます。Ajax.BeginForm

于 2012-11-11T23:05:49.177 に答える