2011-03-12 11 views
1

モデルのプロパティの入力ボックス(テキストボックス)を作成するにはどのように私は、項目のリストを含む単純なショッピング・カート・モデルを持っている

<%using (Html.BeginForm("Recalculate", "ShoppingCart", Model)) 
    { %> 
<table id="cartTable" border ="5px" cellpadding="5px" cellspacing="5px" width="640"> 
    <tr> 
     <td><b>Item Name</b></td> 
     <td><b>Item Qty</b></td> 
     <td><b>Item Price</b></td> 
     <td><b>Subtotal</b></td> 
    </tr> 
    <% 
    if (Model != null && Model.Items != null) 
    { 
     foreach (ShoppingCart.Models.Item item in Model.Items) 
     { 
      %> 
      <tr> 
       <td><%: item.Name%></td> 
       <td><%: Html.TextBoxFor(m => m.Items[Model.Items.IndexOf(item)], new { @Value = item.Quantity })%></td> 
       <td><%: String.Format("{0:C}", item.Price)%></td> 
       <td><%: String.Format("{0:C}", item.TotalCost)%></td> 
      </tr> 
      <% 
     } 
    } 
    %> 
    <!-- some other rows/columns go here --> 
</table> 
<input type="submit" value="Update Cart" /> 
<%} %> 

そして、私のコントローラ::私はCLIC残念ながら

public class ShoppingCartController : Controller 
{ 

    /// </summary> 
    /// <returns></returns> 
    [HttpGet] 
    public ActionResult Show(ShoppingCart model) 
    { 
     if (model!= null && model.Items == null) 
     { 
      List<Item> items = new List<Item>(); 
      items.Add(new Item { Name = "Hat", Price = 20.0, Quantity = 1 }); 
      items.Add(new Item { Name = "Snowboard", Price = 430.0, Quantity = 1 }); 
      items.Add(new Item { Name = "Goggles", Price = 24.0, Quantity = 3 }); 

      model.Items = items; 
      model.Tax = 6.5; 
     } 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Recalculate(ShoppingCart model) 
    { 
     if (model != null && model.Items!=null) 
     { 
      foreach (Item item in model.Items) 
      { 
       if (item.Quantity == 0) 
       { 
        model.Items.Remove(item); 
       } 
       else if (item.Quantity < 0) 
       { 
        ModelState.AddModelError("error", "The quantity for " + item.Name + " must not be smaller than 0."); 
       } 
      } 
     } 
     return RedirectToAction("Show", "ShoppingCart", model); 
    } 

} 

私は、次のビューを作りましたkをクリックして、[再計算]機能を呼び出しますが、アイテムリストのアイテムはすべてnullになりました。アイテムを保持し、アイテムの数量を更新するにはどうすればよいですか?

BeginForm関数では、現在のモデルを渡してみましたが、モデルを渡しませんでした...何も変わりません。誰も私がこれを理解するのを助けることができますか?

答えて

5

行い、適切な場所との事で、これらの変更は、作業を開始します。ポストバックの間、対応するレンダリングされたアイテムは静的テキストであるため、PriceとTotalCostはモデルに移入されません。これらは、コントローラーで再投入するか、またはビューに隠しフィールドを追加して、これらを転記して再投入することができます。

<%using (Html.BeginForm("Recalculate", "ShoppingCart", FormMethod.Post)) 

<td><%: Html.TextBoxFor(m => m.Items[Model.Items.IndexOf(item)].Quantity)%></td> 

//return RedirectToAction("Show", "ShoppingCart", model); 
return View("Show", model); 
+0

これは非常に参考になりました。他のプロパティはどのようにフォームに渡されますか?それらを編集可能にしたくありません。アイテム名やコストを編集する必要はありません。 – Kiril

+0

発信時にバインドされるため、正しく表示されます。しかし、これらの要素はポストバックされていないため、再計算では、これらのプロパティはモデルに設定されません。このためには、モデル内に(DBから)再入力するか、フィールドを隠します。 –

関連する問題