【问题标题】:Post additional input to update ViewModel - adding quantity in shopping cart发布附加输入以更新 ViewModel - 在购物车中添加数量
【发布时间】:2015-06-24 21:47:27
【问题描述】:

我正在使用会话状态开发一种简单的购物车。我让一切正常,但我尝试添加添加相同项目的其他单元的功能。我有一个带有 CartItems 列表的 Cart 类。每个 CartItem 都有 Product 及其数量。使用 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" />

}

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    您对foreach 循环的使用会生成与您的模型无关的重复id 属性(无效的html)和重复的name 属性。 Yu 需要使用for 循环(属性CartItems 必须为IList&lt;CartItem&gt;)或自定义EditorTemplate for typeof 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)
    }
    

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

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

    将绑定到您的模型

    【讨论】:

    • 谢谢斯蒂芬,这有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2012-08-13
    相关资源
    最近更新 更多