gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:27:08 26 4
gpt4 key购买 nike

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

这是类 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

这个索引 View

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

最佳答案

在 ASP.NET MVC 中,通常首选使用 Session 以外的方法来存储数据。 Session 最好用于 multi-screen wizards ,其中上一个 View /操作的结果适用于下一个 View /操作。

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

看起来您正在将多个产品线添加到 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;
}

很难说出您要显示的内容(我认为部分原因是我很难理解 View 的屏幕截图显示的内容,因为它不是我的母语;但我正在关注尽我所能)。但我有一些进一步澄清的意见和问题:

View 应该处于什么抽象级别? Detail 是否填充了 ProductLines ?你想展示多个产品线吗?根据您显示的屏幕截图,您真的只想显示一个。如果您只需要一个,那么我将完全删除 List 的想法,并在详细信息中包含一个 ProductLine

如果您能进一步详细说明您想要的最终结果是什么,以及为什么您有一个似乎只希望显示一个结果的 List,那将会有所帮助。

关于c# - 如何避免数据重复请求MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55480260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com