Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免数据重复请求MVC_C#_Asp.net Mvc - Fatal编程技术网

C# 如何避免数据重复请求MVC

C# 如何避免数据重复请求MVC,c#,asp.net-mvc,C#,Asp.net Mvc,我创建了一个在线商店,试图实现“详细视图”功能。该产品成功地显示了必要的属性,但在查看另一个产品时,前一个产品不会被删除并在存储器中累积。因此,详细的产品审查表包含我使用请求添加的所有产品 这是classDetail namespace App.Domain.Entities { public class Detail { private List<DetailLine> lineCollection = new List<DetailLine

我创建了一个在线商店,试图实现“详细视图”功能。该产品成功地显示了必要的属性,但在查看另一个产品时,前一个产品不会被删除并在存储器中累积。因此,详细的产品审查表包含我使用请求添加的所有产品

这是class
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; }
}
}

这是期望的结果:

这就是问题的结果:

此索引视图

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

@model App.Web.Models.DetailIndexViewModel
@{
ViewBag.Title=“ППаааааааааааааа”;
}
Название
Цена
Вес
Вкус
@foreach(Model.Detail.line中的var行)
{
@line.Product.Name
@行。产品。价格。ToString(“#Бб”)
@线、积、质量
@线条、产品、味道
}
Описание
@foreach(Model.Detail.line中的var行)
{
@产品说明
}

在ASP.NET MVC中,通常首选使用非
会话的方法来存储数据<代码>会话
最适合用于上一个视图/操作的结果适用于下一个视图/操作的情况

我会给你一个“快速”的答案;然后稍后将编辑我的答案,以提供“更好”的方法

看起来您正在向
Detail
类添加多个产品线,而没有删除以前的产品线

如果它是一个列表,但您不想显示多个列表,为什么要将其显示在
列表中?
现在,您可以添加项目,而无需从
会话中删除该项目

会话中删除某些内容
;您需要在适当的位置添加以下内容:

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;    
}
public void RemoveOlderItems(产品)
{
列表行=行集合
.RemoveAll(g=>g.Product.ProductId!=Product.ProductId);
lineCollection=行;
}
很难说你想展示什么(我想部分原因是我很难跟上视图的截图,因为它不是用我的母语显示的;但我正在尽我所能地跟随)。但我有一些进一步澄清的评论和问题:

视图应该处于什么抽象级别?
详细信息
是否填充了
产品线
?您想展示多个产品线吗?根据你展示的截图,你真的只想展示一个。如果您只需要一个,那么我将删除
列表的想法,并在细节中添加一个
ProductLine


如果您可以进一步详细说明最终结果是什么,以及为什么您有一个似乎只希望显示一个结果的
列表,这将有所帮助。

I solve solution adding to DetailController放弃会话:

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

            }
            else {
                Session.Abandon();
            }

            return detail;
        }
    }
}

但是,如何更好地解决这样一个决定,避免会话?

您能提供前端视图吗?您似乎一直在向会话添加项目,但从未删除它们。如果您按照预期的方式使用MVC,那么您根本不应该真正需要该会话。我建议您重新考虑您的设计。我根据“添加到购物车”功能创建了一个“详细视图”,现在我意识到这不是正确的解决方案。目标是以不同的形式显示具有大量属性的产品。例如,主窗体包含3个产品属性:名称、质量、价格。详细列表时必须有更多属性:描述、味道、图像等。。
public Detail GetDetail()
        {
            Detail detail = (Detail)Session["Detail"];
            if (detail == null)
            {
                detail = new Detail();
                Session["Detail"] = detail;

            }
            else {
                Session.Abandon();
            }

            return detail;
        }
    }
}