2014-12-10 4 views
1

Я делаю проект о китайской системе заказа продуктов питания, и я хочу показать выбранные элементы в виде на другой странице. Я пытаюсь использовать сеансы, но я продолжаю получать разные ошибки, такие как «Элемент модели, переданный в словарь, имеет тип», а «ссылка объекта не установлена ​​на экземпляр объекта». Как я могу выбрать данные и показать их в другом виде? Проект связан с базой данных, DishID и другие экземпляры должны быть подключены через базу данных.Сессии в MVC 5 asp.net

Контроллер:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using KinaRest.Models; 
using KinaRest.View_Models; 
using KinaRest.Infrastructure; 

namespace KinaRest.Controllers 
{ 
    public class TakeawayController : Controller 
    { 
     private Basket basket = new Basket(); 

     [ChildActionOnly] 
     public ActionResult BasketItemsList() 
     { 
      Basket basket = new Basket(); 
      return View("_Basket", basket.Items); 
     } 


     // GET: /Takeaway/ 

     private ChinaContext db = new ChinaContext(); 
     [HttpGet] 
     public ActionResult Index() 
     { 
      return View(db.Dish.ToList()); 
     } 


     [HttpPost] 
     public ActionResult Index(BasketItem basketItem) 
     { 
      //Repository repository = new Repository(); 
      if (Session["Basket"] == null) 
      { 
       Session["Basket"] = new Basket(); 
      } 
      else 
      { 
       basket = (Basket)Session["Basket"]; 
      } 
      basket.AddItem(basketItem); 

      return View("Test"); 
     } 

    } 
} 

Модель 1: Корзина

namespace KinaRest.Infrastructure 
{ 
    public class Basket 
    { 
     private List<BasketItem> items = new List<BasketItem>(); 


     public List<BasketItem> Items { get { return items; } } 

     public void AddItem(BasketItem bi) { 
      items.Add(bi); 
     } 
    } 
} 

Модель 2: BasketItem

namespace KinaRest.Infrastructure 
{ 
    public class BasketItem 
    { 
     public int DishId {get; set; } 
     public int Number { get; set; } 
     public decimal Price { get; set; } 
     } 
} 

С этой точки зрения, мы пытаемся собрать данные, такие как ID, количество (количество) и цена в форме:

@model IEnumerable<KinaRest.Models.Dish> 

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

<h2>Index</h2> 

    <div class="form-group"> 
     @using (Html.BeginForm()) 
     {   

      foreach (var item in Model) 
      { 
       <div class="col-md-10"> 
        @Html.DisplayFor(modelItem => item.DishId) 
       </div> 
       <div class="col-md-10"> 
        @Html.DisplayFor(modelItem => item.Title) 
       </div> 
       <div class="col-md-10"> 
        @Html.DisplayFor(modelItem => item.Price) 
       </div> 
       <div class="col-md-10"> 
        @Html.DisplayFor(modelItem => item.Description) 
       </div> 
       <div class="col-md-10"> 
        @Html.DisplayFor(modelItem => item.Type.Type1) 
       </div> 
       <img src="@Url.Content("~/content/images/" + item.Image)" /> 





       @Html.EditorFor(model => item.Number, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => item.Number, "", new { @class = "text-danger" }) 
      <input type="submit" value="Tilføj" class="btn btn-default" /> 
       } 
      } 
     </div> 

С этой точки зрения, мы пытаемся получить доступ к данным сессий:

@model List<KinaRest.Infrastructure.BasketItem> 
@{ 
    ViewBag.Title = "Test"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Test</h2> 

<ul> 
    @foreach (var item in Model) 
    { 
     <li> 
      @Html.DisplayFor(modelItem => item.Number) 
     </li> 
    } 
</ul> 

и да, я новичок в MVC, и я все еще учусь. Надеюсь, вы, ребята, можете помочь.

+0

Рад, что вы нашли ответ. Но сохранение всего набора результатов в сеансе не очень хорошо масштабируется. Как просто сохранить идентификатор, а затем получить требуемый набор результатов в правильном действии контроллера, который будет использоваться для отображения фактического представления? – rsenna

+0

Да, вы правы, но это небольшой проект, просто чтобы показать что-то. Выполнение этого большого, вероятно, потребует того, что вы предлагаете. Но спасибо за ответ, может пригодиться! – Jacob

ответ

1
[HttpGet] 
    public ActionResult Order(int id) 
    { 

     Dish dish = db.Dish.Single(d=> d.DishId == id); //database call here 
     BasketItem basketItem = new BasketItem(){DishId = dish.?, Number = dish.?, Price = dish.Price }; // create a new BasketItem 

     Basket basket; //create reference outside if block 
     //Repository repository = new Repository(); 
     if (Session["Basket"] == null) 
     { 
      basket = new Basket(); 
      Session["Basket"] = basket; 
     } 
     else 
     { 
      basket = (Basket)Session["Basket"]; 
     } 
     basket.AddItem(basketItem); 

     return View("Test", basket.Items); //or return View(((Basket)Session["Basket"]).Items); // give the view the data 
    } 

вынуть класс поле корзина. Насколько я знаю, контроллер инстанциирован каждый раз, когда запрос должен быть обработан

View для заказа

@model IEnumerable<KinaRest.Models.Dish> 

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

<h2>Index</h2> 
<table> 
    <tr><th></th><th>Dish</th><th></th></tr> 
    @foreach(var item in Model) 
    { 
     <tr><td><img src="@Url.Content("~/content/images/" + item.Image)" /></td><td>@html.displayfor(item => item.Name)</td><td>@Html.ActionLink("Add", "Order", "TakeAway", new {id = item.DishId})</td></tr> 
    } 
</table> 
+0

Спасибо за очень быстрый ответ! Проблема в том, что она возвращает нулевые значения, как в: 0, 0 и 0.00, как если бы она не могла видеть данные, которые она должна собирать из формы. Получает ли данные неправильное место? – Jacob

+0

Обычно вы просто работаете с id здесь, поэтому вы помещаете @ html.actionlink («Добавить», «Индекс», «TakeAwayController», новый {id = item.id}) рядом с вашими данными о продукте ... в контроллере вы извлеките данные из базы данных с данным идентификатором и сделайте все, что хотите, с ним –

+0

Получение реального Basketitem потребует формы со всеми полями из корзины –