如何编辑ViewModel ASP.NET中包含的List

时间:2016-01-19 06:19:55

标签: c# asp.net asp.net-mvc asp.net-mvc-4 viewmodel

我正在开发一个项目,我必须使用ASP.NET MVC项目创建购物车。

我试图编辑我存储在自定义ViewModel属性中的值,这是一个对象列表。

该模型如下所示:

public class ShoppingCartVM
{
    public List<ProductVM> CartItems { get; set; }
    public decimal SubTotal { get; set; }
    public decimal Tax { get; set; }
    public decimal Total { get; set; }

    public ShoppingCartVM() {}
    public ShoppingCartVM(List<ProductVM> cartItems) {
        this.CartItems = cartItems;
        this.SubTotal = CalculateSubTotal();
        this.Tax = CalculateTax();
        this.Total = CalulateTotal();
        // CalculateItemCost(); // will update the total cost field of VM
    }

    public decimal CalculateSubTotal()
    {
        decimal? total = 0.00m;
        foreach(var item in this.CartItems)
        {
            total += item.totalCost;
        }
        return (decimal)total;
    }

    public decimal CalculateTax()
    {
        decimal tax = this.SubTotal * 0.07m;
        return tax;
    }

    public decimal CalulateTotal()
    {
        decimal total = this.SubTotal + this.Tax;
        return total;
    }       
}

在视图中我正在尝试遍历列表并为某些值创建可编辑字段,如下所示:

<div class="form-horizontal">
    <h4>ShoppingCartVM</h4>
    <hr />

    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @{ 
        int i = 0;
        // List<ShoppingCartApp.Models.ProductVM> CartItems = new List<ShoppingCartApp.Models.ProductVM>();
    }
    @foreach (var item in Model.CartItems)
    {

        // try to build up an array and add it to
        <span> @item.productID </span>
        @Html.Hidden("Model.CartItems[" + @i + " ].productID",@item.productID);
        <span> @item.productName </span>
        @Html.Hidden("Model.CartItems[" + @i + " ].productName", Model.CartItems[@i].productName);
        @*<input type="number" value="@item.quantity" name="Model.CartItems[@i].quantity" />*@
        @Html.EditorFor(model => model.CartItems[@i].quantity);
        <span> @item.price </span>
        @Html.HiddenFor(model => model.CartItems[@i].price);
        <span> @item.totalCost </span> 
        @Html.HiddenFor(model => model.CartItems[@i].totalCost);
        <br />
        i++;
    }
    @Html.HiddenFor(model => model.CartItems); @*probably wont have updated values*@
    <br />
    @Html.Raw("<p> Sub total: " + Model.SubTotal + "</p>")
    @Html.HiddenFor(model => model.SubTotal)
    @Html.Raw("<p> Tax: " + Model.Tax + "</p>")
    @Html.HiddenFor(model => model.Tax)
    @Html.Raw("<p> Total: " + Model.Total + "</p>")
    @Html.HiddenFor(model => model.Total)
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>
</div>

}

对此有何想法?我将列表存储在VM中以尝试减少业务逻辑&#34;在视图中,这似乎为我创造了更多。

非常感谢您的帮助,

谢谢,

马特

1 个答案:

答案 0 :(得分:0)

因此,要访问值,我将其更改为for循环,然后为每个字段创建一个editorfor或hidden,我需要一个值。这样当我点击&#34;提交&#34;时,它会将所有这些值放入我在Post动作方法中指定的对象。

 @for (int i = 0; i < Model.CartItems.Count; i++)
    {
        @Html.DisplayFor(x => x.CartItems[i].productID);
        @Html.HiddenFor(x => x.CartItems[i].productID);

        @Html.DisplayFor(x => x.CartItems[i].productName);
        @Html.HiddenFor(x => x.CartItems[i].productName);

        @Html.DisplayFor(x => x.CartItems[i].price);
        @Html.HiddenFor(x => x.CartItems[i].price);

        @Html.EditorFor(x => x.CartItems[i].quantity);

        @Html.DisplayFor(x => x.CartItems[i].totalCost);
        @Html.HiddenFor(x => x.CartItems[i].totalCost);                     
    }

将使用正确的名称来编辑字段,以便在我发布时asp.net可以放入相同的对象。

[HttpPost]
    public ActionResult ViewCart(ShoppingCartVM cart)
    {
        return View(cart);
    }

此链接非常有用。

Posting to a list<modeltype> MVC3

谢谢,

马特