C# 如何编辑ViewModel ASP.NET中包含的列表

C# 如何编辑ViewModel ASP.NET中包含的列表,c#,asp.net,asp.net-mvc,asp.net-mvc-4,viewmodel,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Viewmodel,我正在做一个项目,我必须使用ASP.NETMVC项目创建一个购物车 我一直在试图编辑存储在自定义ViewModel属性(即对象列表)中的值 模型如下所示: public class ShoppingCartVM { public List<ProductVM> CartItems { get; set; } public decimal SubTotal { get; set; } public decimal Tax { get; set; } pu

我正在做一个项目,我必须使用ASP.NETMVC项目创建一个购物车

我一直在试图编辑存储在自定义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>
公共类ShoppingCartVM
{
公共列表项{get;set;}
公共十进制小计{get;set;}
公共十进制税{get;set;}
公共十进制总数{get;set;}
公共ShoppingCartVM(){}
公共购物车VM(列出购物车项目){
this.CartItems=CartItems;
this.SubTotal=CalculateSubTotal();
this.Tax=calculateAX();
this.Total=CalulateTotal();
//CalculateItemCost();//将更新VM的总成本字段
}
公共十进制计算subtotal()
{
小数?总计=0.00m;
foreach(此.CartItems中的变量项)
{
合计+=项目总成本;
}
返回(十进制)总计;
}
公共十进制计算器
{
十进位税=此项小计*0.07m;
退税;
}
公共十进制计算器()
{
小数点合计=本次小计+本次税金;
返回总数;
}       
}
在视图中,我正在尝试循环列表,并为一些值创建可编辑字段,如下所示:

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>

购物车

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @{ int i=0; //List CartItems=新列表(); } @foreach(Model.CartItems中的var项) { //尝试建立一个数组并将其添加到 @item.productID @Html.Hidden(“Model.CartItems[“++@i+”].productID”,@item.productID); @item.productName @Html.Hidden(“Model.CartItems[“++@i+”].productName”,Model.CartItems[@i].productName); @**@ @Html.EditorFor(model=>model.CartItems[@i].quantity); @项目.价格 @Html.HiddenFor(model=>model.CartItems[@i].price); @项目.总成本 @Html.HiddenFor(model=>model.CartItems[@i].totalCost);
i++; } @Html.HiddenFor(model=>model.CartItems)@*可能不会有更新的值*@
@Html.Raw(小计:“+Model.SubTotal+”

) @Html.HiddenFor(model=>model.SubTotal) @Html.Raw(“Tax:+Model.Tax+”

”) @Html.HiddenFor(model=>model.Tax) @Html.Raw(“Total:+Model.Total+”

”) @Html.HiddenFor(model=>model.Total)
}

有什么想法吗?我将列表存储在VM中,试图减少视图中的“业务逻辑”,但这似乎为我创造了更多

非常感谢您的帮助

谢谢


Matt

为了访问值,我将其更改为for循环,然后为每个需要值的字段创建editorfor或hidden。这样,当我点击“submit”时,它会将所有这些值放入我在Post-action方法中指定的对象中

 @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);                     
    }
这个链接非常有用

谢谢


Matt

为了访问值,我将其更改为for循环,然后为每个需要值的字段创建editorfor或hidden。这样,当我点击“submit”时,它会将所有这些值放入我在Post-action方法中指定的对象中

 @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);                     
    }
这个链接非常有用

谢谢


Matt

使用
for
循环,而不是
foreach
循环,或者更好地使用自定义
EditorTemplate
用于由
CartItems
属性表示的模型(您还没有向我们显示模型)。是的,粘贴了错误的代码。我的错误。当你说编辑器模板时,你是指@html.editorfor?在循环中如何使用它?根据您的编辑,您需要删除
@Html.HiddenFor(model=>model.CartItems)
——这只会导致绑定失败(查看它生成的Html。为
小计
总计
税务
添加隐藏输入是毫无意义的(当然,这种计算是基于你从未考虑过的数量)。你不会在循环中使用
EditorTemplate
。你使用
@Html.EditorFor(m=>m.CartItems)
为集合中的每个项目生成Html(并为
ProductVM
的类型创建
EditorTemplate
)使用
for
循环,而不是
foreach
循环,或者最好对
CartItems
属性表示的模型使用自定义
编辑器或模板
(而且您还没有向我们展示模型)。是的,粘贴了错误的代码。我的错误。当你说编辑器模板时,你的意思是@html.editorfor?我如何在循环中使用它?根据你的编辑,你需要删除
@html.HiddenFor(model=>model.CartItems)
-这只会导致绑定失败(看看它生成的html。为
SubTotal
Total
Tax
添加隐藏的输入是毫无意义的(当然,这些计算是基于你从未考虑过的数量)。你不会在循环中使用
EditorTemplate
。你使用
@html.EditorFor(m=>m.CartItems)
为集合中的每个项目生成html(并为typeof
ProductVM
创建一个
EditorTemplate