首页 > 解决方案 > 在 OnGet 和 OnPost 之间保持对象状态

问题描述

我已经在我的类中注册了一项服务,在我的页面方法之一中Startup初始化我的属性,然后调用,使我的属性丢失。我做错了什么?解决方案是什么?UserServiceOnGet()OnPost()

启动.cs

public void ConfigureServices(IServiceCollection services)
{
  //...
  services.AddScoped<IUserService, UserService>();
}

我的用户服务类

public class UserService : IUserService
{
  // ...
  private ApplicationUser _appUser;
  public void Initalize(ClaimsPrincipal claim)
  {
    var curretUserId = claim.FindFirstValue(ClaimTypes.NameIdentifier);
    _appUser =  _userManager.FindByIdAsync(curretUserId).Result;
  }
}

我的主页的后端之一

[Authorize]
public class CreateModel : PageModel
{
  // ....
  private readonly IUserService _userService;
  public CreateModel( // ... dependencies,
                     IUserService userService)
  {
    _userService = userService;
  }

  public async Task<IActionResult> OnGetAsync(string id)
  {
    // ...
    _userService.Initalize(User);
    // everything are good here, _appUser is initalized and I have all my properties are initialized
  }
  public async Task<IActionResult> OnPostAsync()
  {
    // _userService._appUser is NULL here. Why?
  }
}

标签: c#asp.net-corerazordependency-injectionasp.net-core-mvc

解决方案


问题是您的 UserService 在每次请求时都会重新创建。

更新

因为我的第一个答案由于某种未知的原因没有解决 OPs 问题,所以这里是第二个建议。

将此添加到PageModel类(如果更合适,可以是 int 类型)

[BindProperty]
public string SelectedUserId { get; set; }

像这样更改获取和发布方法

public async Task<IActionResult> OnGetAsync(string id)
{
  ...
  SelectedUserId = ... some value
  ...
}

public async Task<IActionResult> OnPostAsync()
{
   ... use SelectedUserId to get user to work with
   
   ...
}

这里的线索是将表单内的请求之间的 SelectedUserId 保存为隐藏的。

如果这还不够,来自对象的多个属性可能会被序列化为表单中的多个隐藏,并在 PageModel 类中反序列化。

为了达到最高水平,对象可以实现 ToString,将对象字符串存储在一个隐藏的表单中,并在发布请求时反序列化对象。

不幸的是,我们在这个问题中没有任何可用的标记,所以我把这部分省略了。


推荐阅读