Razor Page中For Each循环始终传递首行数据致Next Date计算异常
Razor Page循环渲染时Next Date列固定返回首行计算结果
问题表现
- 页面基础功能可正常运行,通过
For Each循环构建表格渲染Model.Dances_Moderated数据时,除Next Date计算列外,其余列均可随循环迭代正常展示对应行的数值 - Next Date列遍历多行数据过程中,始终向日期计算函数传递首行数据,导致所有行该列均显示首行计算结果
- 所用的VB日期计算函数在其他多个VB.Net应用中均可稳定无差错运行,排除函数本身逻辑问题
相关代码片段
页面头部引入配置
@page @model Moderate.Pages.DanceList.ThisCityModel @using VB_Stuff.VB_Stuff;
表格循环起始代码
<tbody> @foreach (var item in Model.Dances_Moderated) {
异常列原有实现
<td> @{ DateStuff obj = new DateStuff(); string strTodayTomorrow = obj.fTodayTomorrow(Model.Dances_Moderated[0].RecurYesNo, Model.Dances_Moderated[0].SingleDate, Model.Dances_Moderated[0].RecurWeekOfMonth, Model.Dances_Moderated[0].RecurDayOfWeek); if (strTodayTomorrow == "") { string NextEvent = obj.fNextEvent(Model.Dances_Moderated[0].RecurYesNo, Model.Dances_Moderated[0].SingleDate, Model.Dances_Moderated[0].RecurWeekOfMonth, Model.Dances_Moderated[0].RecurDayOfWeek); @Html.Raw(NextEvent) } else { @Html.Raw(strTodayTomorrow) } } </td>
故障原因
循环内部调用日期计算函数时,没有使用当前迭代的item对象传参,而是硬编码写死了[0]索引固定取集合首行元素,因此每一行渲染时传入函数的永远是第一行的数据,计算结果自然全部和首行一致,和VB函数本身逻辑无关。
修复方法
将所有传参位置的Model.Dances_Moderated[0]替换为当前循环变量item即可,修正后的代码如下:
<td> @{ DateStuff obj = new DateStuff(); // 使用当前循环迭代的item对象传参 string strTodayTomorrow = obj.fTodayTomorrow(item.RecurYesNo, item.SingleDate, item.RecurWeekOfMonth, item.RecurDayOfWeek); if (strTodayTomorrow == "") { string NextEvent = obj.fNextEvent(item.RecurYesNo, item.SingleDate, item.RecurWeekOfMonth, item.RecurDayOfWeek); @Html.Raw(NextEvent) } else { @Html.Raw(strTodayTomorrow) } } </td>
可选优化:如果
DateStuff类不依赖单次调用的上下文状态,不需要在循环内重复实例化,可以把DateStuff obj = new DateStuff();提到循环外部,减少不必要的对象创建开销。
内容的提问来源于stack exchange,提问作者JustJohn
相关产品推荐
相关产品推荐

