ASP.NET中如何在foreach循环中为每个元素获取前一个值?
如何在foreach循环中正确获取每个元素的前一个值
我来帮你排查下问题——你当前的代码逻辑明显走偏了,导致输出全是第一个元素的值。咱们先拆解下核心问题:
先看你视图里的内层for循环:
@for (var i = 0; i < ViewBag.ce.Count - ViewBag.ce.Count + 1; i++) { var previous = ViewBag.ce[i]; @(previous) }
这个循环的条件ViewBag.ce.Count - ViewBag.ce.Count +1结果永远是1,所以每次for循环只会执行1次,而且每次都取ViewBag.ce[0]也就是100,这就是为啥后面的输出全是100的原因。
你的需求是:输出原集合的所有元素后,再输出每个元素的前一个值(第一个元素的前一个值用0代替)。那正确的思路应该是分两步处理:
修正后的视图代码
@{ // 先把ViewBag转成强类型集合,避免动态类型的潜在问题 var prizeList = ViewBag.ce as List<int>; } @* 第一步:输出原集合的所有元素 *@ @foreach (var prize in prizeList) { @prize @: } @* 第二步:输出每个元素的前一个值,第一个元素的前一个值设为0 *@ @for (var i = 0; i < prizeList.Count; i++) { var previousValue = i == 0 ? 0 : prizeList[i - 1]; @previousValue @: }
额外优化:控制器端的小建议
虽然你的控制器代码能运行,但最好通过强类型ViewModel传递数据(如果项目允许的话),避免ViewBag动态类型的转换风险。如果坚持用ViewBag,视图里转成强类型的步骤是必要的,控制器代码可以保持不变:
var Reward = db.Reward.Where(p => p.Category == 1).Select(p => p.Prize).ToList(); ViewBag.ce = Reward;
这样调整后,运行结果就会完全符合你的期望:100 200 300 400 500 600 700 0 100 200 300 400 500 600
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

