как избежать дублирования данных запроса MVC - PullRequest
3 голосов
/ 02 апреля 2019

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

Это класс Detail

namespace App.Domain.Entities
{
    public class Detail 
    {
        private List<DetailLine> lineCollection = new List<DetailLine>();

        public void AddItem(Product product)
        {
            DetailLine line = lineCollection
                .Where(g => g.Product.ProductId == product.ProductId)
                .FirstOrDefault();

            if (line == null)
            {
                lineCollection.Add(new DetailLine
                {
                    Product = product
                });   
            }

        }
        public IEnumerable<DetailLine> Lines
        {
            get { return lineCollection; }
        }
    }
public class DetailLine
    {
        public Product Product { get; set; }
}
}

Это DetailController

namespace App.Web.Controllers
{
    public class DetailController : Controller
    {
        public ViewResult Index(string returnUrl)
        {
            return View(new DetailIndexViewModel
            {
                Detail = GetDetail(),
                ReturnUrl = returnUrl
            });
        }
        private IProductRepository repository;
        public DetailController(IProductRepository repo)
        {
            repository = repo;
        }
        public RedirectToRouteResult AddToDetail(int productId, string returnUrl)
        {
            Product product = repository.Products
                .FirstOrDefault(g => g.ProductId == productId);

            if (product != null  )
            {
                GetDetail().AddItem(product);
            }
            return RedirectToAction("Index", new { returnUrl });
        }



        public Detail GetDetail()
        {
            Detail detail = (Detail)Session["Detail"];
            if (detail == null)
            {
                detail = new Detail();
                Session["Detail"] = detail;
            }
            return detail;
        }
    }
}

Это желаемый результат: this is the desired result

Это результат ошибки: this trouble result

Этот индексный просмотр

@model App.Web.Models.DetailIndexViewModel
@{
    ViewBag.Title = "Подробное описание товара";
}
<table class="table">
    <thead>
        <tr>
            <th>Название</th>
            <th class="text-left">Цена</th>
            <th class="text-left">Вес</th>
            <th class="text-left">Вкус</th>

        </tr>
    </thead>
    <tbody>
        @foreach (var line in Model.Detail.Lines)
        {
            <tr>
                <td class="text-left">@line.Product.Name</td>
                <td class="text-left">@line.Product.Price.ToString("# руб")</td>

                <td class="text-left">@line.Product.Mass</td>
                <td class="text-left">@line.Product.Taste</td>
            </tr>

        }
    </tbody>
</table>
<tr>
    <th class="text-center" >Описание</th>
</tr>
@foreach (var line in Model.Detail.Lines)
{
<div class="container">
    @line.Product.Description

</div>
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

В ASP.NET MVC обычно предпочитают использовать метод, отличный от Session, для хранения данных. Session лучше всего использовать для многоэкранных мастеров , где результаты предыдущего представления / действия применимы к следующему представлению / действию.

Я дам вам «быстрый» ответ; и затем отредактирую мой ответ позже, чтобы обеспечить «лучший» подход.

Похоже, вы добавляете несколько линий продуктов в класс Detail, не удаляя предыдущие.

Если это список, но вы не хотите показывать больше, чем один, почему у вас он есть в List? Прямо сейчас вы AddItem не удалив предмет из Session.

удалить что-то из Session; вам нужно добавить это в соответствующем месте:

var detail = (Detail)Session["Detail"];
detail.RemoveOlderItems(product);
Session["Detail"] = detail;

С RemoveOlderItems Выглядит так:

public void RemoveOlderItems(Product product)
{
    List<DetailLine> lines = lineCollection
        .RemoveAll(g => g.Product.ProductId != product.ProductId);
    lineCollection = lines;    
}

Трудно сказать, что вы пытаетесь показать (я думаю, что отчасти мне трудно понять, что показывают снимки экрана, поскольку это не на моем родном языке; но я следую как можно лучше). Но у меня есть еще несколько уточняющих комментариев и вопросов:

На каком уровне абстракции должен быть вид? Detail заполнено ProductLines? Вы хотите показать несколько линеек продуктов? На основе скриншотов, которые вы показали, вы действительно хотите показать только один. Если вам нужен только один, тогда я бы полностью исключил идею List и в деталях был бы один ProductLine.

Если вы сможете уточнить, каков конечный результат, к которому вы стремитесь, и почему у вас есть List, где кажется, что вы хотите показать только один результат, это поможет.

0 голосов
/ 03 апреля 2019

Я решаю добавление решения в сеанс прекращения работы DetailController:

public Detail GetDetail()
        {
            Detail detail = (Detail)Session["Detail"];
            if (detail == null)
            {
                detail = new Detail();
                Session["Detail"] = detail;

            }
            else {
                Session.Abandon();
            }

            return detail;
        }
    }
}

Однако, как было бы лучше принять такое решение, избегая сессии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...