2016-01-19 2 views
-1

Я работаю над проектом, где мне нужно создать корзину покупок с помощью проекта ASP.NET MVC.Как редактировать список, содержащийся в ViewModel ASP.NET

Я застреваю, пытаясь редактировать значения, которые я сохранил в свойстве настраиваемого 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> 

}

Любые мысли по этому поводу? Я сохранил список на виртуальной машине, чтобы попытаться уменьшить «бизнес-логику» в представлении, но это, похоже, создает больше для меня.

Ваша помощь будет высоко оценена,

Спасибо,

Matt

+0

Используйте 'for' цикл, а не' foreach' петли, или лучше использовать пользовательские 'EditorTemplate' для модели, представленной' CartItems' (и вы не показали нам модель). –

+0

Да, вставлен в неправильный код. Виноват. –

+0

Когда вы произносите редакторский шаблон, вы имеете в виду @ html.editorfor? Как я могу использовать это, находясь внутри цикла? –

ответ

0

Так доступа к значениям Я изменил его для цикла, а затем созданных либо editorfor или скрытом для каждого поля я нужно значение для. Таким образом, когда я нажму «submit», он поместит все эти значения в объект, указанный в методе «Пост-действие».

@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);      
    } 

Будет ли ginerate поля с правильным именем, поэтому asp.net может помещать в тот же объект, когда я отправляю сообщение.

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

Эта ссылка была очень полезна.

Posting to a list<modeltype> MVC3

Спасибо,

Matt

Смежные вопросы