Razor页面中如何从PageModel为绑定的业务模型赋值
解决方案
步骤1:调整PageModel依赖注入
你使用了Identity框架获取当前用户,需要先在CreateModel中注入UserManager服务。
步骤2:将自动赋值逻辑放到OnPostAsync方法中
你原来在类成员位置直接写赋值代码属于语法错误,C#不允许在类的成员定义区域直接写执行代码,所有业务逻辑必须放到方法内。我们选在表单验证通过、数据入库前完成自动字段填充,位置在if (!ModelState.IsValid)判断之后,_context.Add操作之前。
修改后完整的PageModel代码
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using ArchiProjectManager.Data; using ArchiProjectManager.Models; using Microsoft.AspNetCore.Identity; namespace ArchiProjectManager.Pages.Users.Clients { public class CreateModel : PageModel { private readonly ApplicationDbContext _context; // 注入UserManager用于获取当前登录用户 private readonly UserManager<User> _userManager; public CreateModel(ApplicationDbContext context, UserManager<User> userManager) { _context = context; _userManager = userManager; } public DateTime CurrentDate = DateTime.Now; public IActionResult OnGet() { return Page(); } [BindProperty] public ModelForClients ModelForClients { get; set; } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } // 此处添加自动填充逻辑 ModelForClients.CreationDate = DateTime.Now; ModelForClients.ModificationDate = DateTime.Now; // 获取当前登录用户对象 var currentUser = await _userManager.GetUserAsync(User); ModelForClients.User = currentUser; // 如果UserType存的是用户名可以直接用下面的代码,不用查库 // ModelForClients.UserType = User.Identity.Name; // 如果需要存用户的角色/类型,可以自行从currentUser对应的字段取 _context.ModelForClients.Add(ModelForClients); await _context.SaveChangesAsync(); return RedirectToPage("./Clients"); } } }
补充说明
如果你的UserType字段仅需要存储当前登录用户的显示名/账号,不需要关联完整的用户导航属性,可以直接使用User.Identity.Name赋值,不用注入UserManager也不用查数据库,性能更好。
内容的提问来源于stack exchange,提问作者AnthoVdo
相关产品推荐
相关产品推荐

