2012-11-11 44 views
0

我有一個包含賣家集合的視圖模型的局部視圖。我遍歷所有的賣家呈現列表。這裏是視圖模型:HTML表單提交集合中的單個項目

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

在局部視圖我使用Html.BeginCollectionItem(「賣方」),當我遍歷集合,這裏是我的部分碼(僅供參考,我剝奪待看到了很多無用的代碼並不需要):

<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> 

但是我想這工作正常渲染局部和獲取客戶端驗證工作 每個賣家有輸入命名qty和對於稱爲PurchaseShares(int orderId, int qty)的控制器動作,使用orderId

唯一的問題是表單被提交與奇怪的GUID像Sellers[5b5fd3f2-12e0-4e72-b289-50a69aa06158].seller.Qty我明白是正確的提交集合,但我不需要那樣做。

現在我有一些Javascript正在更新class="buyer-qty"與他們選擇的任何東西,它工作正常,但必須有一個更好的方式做到這一點,不是嗎?

感謝

回答

1

你爲什麼要使用Html.BeginCollectionItem幫手,如果你不想提交藏品?

你可以有一個部分代表您的訂單採集項目(_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,或者當您提交它時可能會發生炸彈。如果您不想將其作爲輸入字段包含,也可以將其作爲Ajax.BeginForm助手的routeValues參數的一部分發送。

+0

這看起來很有前途,我將不得不嘗試一下。我想知道爲什麼我必須爲OrderViewModel創建一個部分? Html.Partial是否在幕後做了一些無法在主要局部視圖中完成的事情? – Ryan

+1

使用部分輸入字段的名稱將是'Qty'而不是'seller.Qty'。所以如果你不使用partial,你必須用'[Bind]'屬性在'PurchaseShares'動作上修飾'OrderViewModel'動作參數,以指定'seller'前綴。 –

+0

非常感謝! – Ryan