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