如何解决将对象状态保持在OnGet和OnPost之间
我已经在我的Startup
类中注册了服务,在页面的UserService
方法之一中初始化了OnGet()
的属性,然后调用了OnPost()
,我的财产。我怎么做错了?解决办法是什么?
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddScoped<IUserService,UserService>();
}
我的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,将对象字符串以隐藏的形式存储在表单中,并在发布请求时反序列化对象。
不幸的是,我们在该问题中没有可用的标记,因此我省略了该部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。