Я делаю проект о китайской системе заказа продуктов питания, и я хочу показать выбранные элементы в виде на другой странице. Я пытаюсь использовать сеансы, но я продолжаю получать разные ошибки, такие как «Элемент модели, переданный в словарь, имеет тип», а «ссылка объекта не установлена на экземпляр объекта». Как я могу выбрать данные и показать их в другом виде? Проект связан с базой данных, 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, и я все еще учусь. Надеюсь, вы, ребята, можете помочь.
Рад, что вы нашли ответ. Но сохранение всего набора результатов в сеансе не очень хорошо масштабируется. Как просто сохранить идентификатор, а затем получить требуемый набор результатов в правильном действии контроллера, который будет использоваться для отображения фактического представления? – rsenna
Да, вы правы, но это небольшой проект, просто чтобы показать что-то. Выполнение этого большого, вероятно, потребует того, что вы предлагаете. Но спасибо за ответ, может пригодиться! – Jacob