You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Razor Pages中修改的对象属性渲染时为空,求原因排查

问题原因与解决方案

你的问题核心在于IEnumerable的延迟执行特性。

具体原因

_paymentService.GetAll()返回的大概率是一个延迟执行的查询对象(比如EF Core中的IQueryable<T>,它继承自IEnumerable<T>)。当你直接把它赋值给Entities后:

  • 第一次遍历foreach (var entity in Entities)时,才会触发查询,生成一批Payment对象,你修改了它们的CategoryName;
  • 但当Razor页面渲染时,会再次遍历Entities,这会重新执行一次查询,生成全新的Payment对象——这些新对象的CategoryName自然是空的,所以你之前的修改没生效。

而你第一种写法用Select创建新Payment实例并赋值,本质上是把查询结果转换成了内存中的对象集合(或通过硬编码属性值确保结果确定),不会因为重新执行查询丢失修改。

解决方法

把延迟执行的IEnumerable转换成立即执行的内存集合,比如用ToList()或ToArray(),这样查询只会执行一次,后续修改和渲染都是操作同一个内存集合:

public IEnumerable<Payment> Entities { get; set; } = default!;

public async Task OnGetAsync()
{
    // 用ToList()立即执行查询,把结果加载到内存
    Entities = (await _paymentService.GetAll()).ToList();
    
    foreach (var entity in Entities)
    {
        entity.CategoryName = "Bar";
    }
}

这样修改后,Entities是内存中的List对象,遍历修改的是实际存在的对象,渲染时不会重新查询,CategoryName就能正常显示了。

内容的提问来源于stack exchange,提问作者dafie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:15