c# - 在 OnGet 和 OnPost 之间保持对象状态
问题描述
我已经在我的类中注册了一项服务,在我的页面方法之一中Startup
初始化我的属性,然后调用,使我的属性丢失。我做错了什么?解决方案是什么?UserService
OnGet()
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?
}
}
解决方案
问题是您的 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,将对象字符串存储在一个隐藏的表单中,并在发布请求时反序列化对象。
不幸的是,我们在这个问题中没有任何可用的标记,所以我把这部分省略了。
推荐阅读
- html - 在 VS Code 中保存时关闭自动关闭的 HTML 标签?
- asynchronous - 如何测量 Julia 中函数的 @async 运行时?
- pact - 使用 SpringRestPactRunner 时出现 NoSuchMethodException
- function - 有人可以帮我把这个函数翻译成 sml 吗?
- javascript - 如何在 appcelerator Titanium 中将 WKWebView 与本地文件一起使用?
- kubernetes - Prometheus 查询获取整个集群的内存限制承诺
- bash - 从数组中挑选数字,看看它们是否是偶数并且小于 380
- linux - 如何使用 x86-64 和 Linux 在 PCIE 总线上生成零长度读取?
- pine-script - 在代码交易视图中隐藏图表、数量和信号标签上的交易
- javascript - Angular 8 - 未加载运行时编译器错误