2015-12-18 3 views
1

У меня есть проект, чтобы сделать интернет-магазин между пользователями (отправить товар, купить и т. Д.) С помощью базы данных. В этом проекте у меня есть представление под названием «ShoppingCart»:Вызов httppost actionresult изнутри с помощью кнопки

@model IEnumerable<MyFirstProject.Models.Product> 

@{ 
    ViewBag.Title = "ShoppingCart"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Your Shopping Cart</h2> 



@if (Model == null) 
{ 
    <div style="float:left">Your cart is empty.</div> 
    <div> 
     Total payment: 0 
    </div> 
} 
else 
{ 
    decimal tPrice = 0; 
    <div> 
    <table style="float:left"> 
     @foreach (var product in Model) 
     { 
      tPrice = tPrice + product.Price; 
      { Html.RenderPartial("ProductLine", product);} 
     } 
    </table> 
     </div> 
    <div> 
     Total payment: @tPrice 
    </div> 
} 

Он получает список товаров, которые пользователь решил купить и отображает их (не важная часть). Мне нужно добавить кнопку, которая будет посылать список с результатом действия в «ShoppingController»:

[HttpPost] 
     public ActionResult ShoppingCart(List<Product> bought) 
     { 
      if (ModelState.IsValid) 
      { 
       foreach (var listP in bought.ToList()) 
       { 
        foreach (var databaseP in db.Products.ToList()) 
        { 
         if (listP.ProductID == databaseP.ProductID) 
         { 
          databaseP.State = 1; 
          db.SaveChanges(); 
          break; 
         } 
        } 
       } 
       return RedirectToAction("Index"); 
      } 

      else 
      { 
       return View(bought); 
      } 
     } 

«Государство» означает, если продукт был куплен или нет (0 = не купил, 1 = купил), db - это база данных

+0

У вас нет. (вам нужно будет включить элемент управления формой для каждого свойства каждого продукта, который вы видите). Если это страница подтверждения, вы просто публикуете значение идентификатора, а затем извлекаете коллекцию продуктов, которые пользователь уже выбрал, и извлеките их из ранее сохраненного хранилища (предположим, вы использовали 'Session'?). –

ответ

0

Если вы не отправляете какие-либо данные из вида в метод действия, вы должны хранить эти данные в элементах формы и сохранять их в форме. Поскольку вы хотите опубликовать коллекцию предметов, вы можете использовать Редактор Шаблоны.

Начнем с создания модели представления.

public class ShoppingCartViewModel 
{ 
    public decimal TotalPrice { set; get; } 
    public List<Product> CartItems { set; get; } 
} 

public class Product 
{ 
    public int Id { set; get; } 
    public string Name { set; get; } 
} 

Теперь в вашем GET действия, вы создадите объект ShoppingCartViewModel, загрузите CartItems объект недвижимости и отправить в представлении.

public ActionResult Index() 
{ 
    var cart = new ShoppingCartViewModel 
    { 
     CartItems = new List<Product> 
     { 
      new Product { Id = 1, Name = "Iphone" }, 
      new Product { Id = 3, Name = "MacBookPro" } 
     }, 
     TotalPrice = 3234.95 
    }; 
    return View(cart); 
} 

Теперь я создам шаблон EditorTemplate. Чтобы сделать это, перейдите в папку ~/Views/YourControllerName и создать каталог с именем EditorTemplates и добавить представление с именем Product.cshtml

Имя файла должно совпадать с именем типа.

enter image description here

Открыть этот новый вид и добавить код, приведенный ниже.

@model YourNamespace.Product 
<div> 
    <h4>@Model.Name</h4> 
    @Html.HiddenFor(s=>s.Id) 
</div> 

Вы можете сохранить дисплей, как хотите. Но важно то, что нам нужно сохранить поле формы для productId. Мы держим это в скрытом поле здесь.

Теперь вернемся к нашему главному виду. Нам нужно сделать это представление строго типизированным для нашего ShoppingCartViewModel. Мы будем использовать вспомогательный метод EditorFor HTML С этой точки зрения, чтобы позвонить в наш шаблон редактор

@model ReplaceYourNamespaceHere.ShoppingCartViewModel 
@using (Html.BeginForm()) 
{  
    @Html.EditorFor(x => x.CartItems) 
    <p>Total : @Model.TotalPrice</p> 
    <input type="submit" /> 
} 

И в методе действия HttpPost, мы будем иметь paramer типа ShoppingCartViewModel. Когда форма отправляется, связующее MVC Model сопоставляет значения размещенных форм с объектом ShoppingCartViewModel.

[HttpPost] 
public ActionResult Index(ShoppingCartViewModel model) 
{ 
    foreach (var item in model.CartItems) 
    { 
     var productId = item.Id; 
     // to do : Use productId and do something 
    } 
    return RedirectToAction("OrderSucessful"); 
} 

Вы можете перебирать CartItems коллекции и получить Id Продуктов и делать все, что вы хотите.

enter image description here

Если вы wan't, чтобы позволить пользователю редактировать элементы (используя флажок) в этой странице Вы найдете this answer. Это в основном то же самое, но вы добавляете логическое свойство в класс Product и используете это для рендеринга флажка.