发布更新ViewModel的额外输入 - 在购物车中添加数量

时间:2015-06-24 21:47:27

标签: asp.net-mvc razor

我正在使用会话状态开发一种简单的购物车。我把一切都搞定了,但我尝试添加添加同一项目的其他单位的功能。我有一个带有CartItem列表的Cart类。每个CartItem都有产品及其数量。使用GET方法的视图获得了一个很好的更新购物车和会话(除了数量,我打算用POST请求修复)。

我尝试了下面的路径,但数量总是停留在0.我在这里看到了类似的帖子,这可能会增加同样的问题。

http://stackoverflow.com/questions/23363813/why-isnt-my-viewmodel-updating

但是它需要Knockout js,我还没有接触到(并且需要在短时间线上完成我的学校项目)。如果有关于淘汰赛的想法,我将非常感激。为清晰起见,下面是简化的代码。

控制器

[HttpPost]
public ActionResult Show(CartViewModel cvm) 
{
Cart cart = (Cart)Session["Cart"];
cvm.CartItems = cart.CartItems;

StringBuilder sb = new StringBuilder();

if (TryUpdateModel(cvm))
{
    foreach (CartItem c in cvm.CartItems)
    {
        sb.Append(c.Product.Name); // works
        sb.Append(c.Quantity); // always 0 :(
    }
}

return RedirectToAction("Index", "Home");
}

查看

@model Project.ViewModels.CartViewModel

@using (Html.BeginForm())
{
foreach (var item in Model.CartItems)
    {
        @item.Product.Name
        <img src="@item.Product.Image" alt="@item.Product.Name"/>

    @Html.EditorFor(i => item.Quantity)
    }
}

<input type="submit" value="Send" />

}

1 个答案:

答案 0 :(得分:1)

您使用foreach循环会生成重复的id属性(无效的html)和与您的模型无关的重复name属性。 Yu需要使用for循环(属性CartItems必须为IList<CartItem>)或自定义EditorTemplate用于CartItem类型。

使用for循环

for(int i = 0; i < Model.CartItems.Count; i++)
{
    @Html.DisplayFor(m => m.CartItems[i].Name)
    <img src="@Model.CartItems[i].Product.Image" alt="@Model.CartItems[i].Product.Name"/>
    @Html.EditorFor(m => m.CartItems[i].Quantity)
}

这将为属性name生成正确的Quantity属性,例如

<input name="CartItems[0].Quantity" ...>
<input name="CartItems[1].Quantity" ...>

将绑定到您的模型