.NET 8 Blazor:为何Razor中for循环渲染显示最终变量值?
Razor中for循环渲染变量始终为最终值的原因与解决方法
在Razor标记中使用for循环时,渲染出的变量总是循环的最终值而非递增的计数,为何会出现这种情况?我猜测这是设计如此,若果真如此,能否有人解释其原因与实现机制?查阅微软官网文档后,未找到Razor文件中for循环此行为的相关解释。
示例代码
<MudStack> @for (int x = 0; x < 5; x++) { <MudPaper> <MudText Typo="Typo.body1"> @(x) </MudText> </MudPaper> } </MudStack>
实际结果
渲染后所有内容均为循环的最终值:
5 5 5 5 5
期望结果
原本预期的递增输出:
0 1 2 3 4
原因分析
这是Razor延迟绑定特性导致的问题。循环变量x在整个for循环的作用域内是同一个实例,Razor并不会在循环执行时立即渲染组件,而是先构建组件树。当最终执行渲染逻辑时,循环已经完全结束,所有组件引用的都是同一个x变量的最终值(即循环结束时的5)。
解决方法
在循环内部创建一个局部变量,将当前x的值赋值给这个局部变量,让每个组件绑定到独立的变量实例上:
<MudStack> @for (int x = 0; x < 5; x++) { var currentX = x; // 用局部变量保存当前循环值 <MudPaper> <MudText Typo="Typo.body1"> @(currentX) </MudText> </MudPaper> } </MudStack>
修改后,每个MudPaper组件都会绑定到各自的currentX变量,渲染时就能得到正确的递增数值。
内容的提问来源于stack exchange,提问作者Ponderer
相关产品推荐
相关产品推荐

