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 集合项 ( _Order.cshtml):

@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 回答