ASP.NET MVC中Identity ApplicationUser数据填充及视图显示问题排查
解决ASP.NET MVC中关联ApplicationUser到视图的问题
问题背景
我正在尝试创建关联ApplicationUser的模型,已经定义了OrganizationViewModel,但视图里没法显示特定帖子对应的用户名。同时想搞清楚在ASP.NET MVC里怎么填充Identity的ApplicationUser数据。相关代码如下:
模型代码
public class OrganizationViewModel { public ApplicationUser AppUser { get; set; } public int OrganizationId { get; set; } public string Name { get; set; } }
控制器代码片段
public ActionResult Create(OrganizationViewModel organizationviewmodel) { var getuserid = User.Identity.GetUserId(); var userid = db.Users.Single(s => ...
一步步解决你的问题
1. 把ApplicationUser数据正确填充到ViewModel里
首先得确保在控制器中,把需要展示的用户实例(不管是当前登录用户还是特定帖子的创建者)正确赋值给ViewModel的AppUser属性。
比如在展示组织详情的Details Action里,可以这么写:
public ActionResult Details(int id) { // 先找到对应的组织记录(根据你的实际数据库结构调整) var organization = db.Organizations.Find(id); if (organization == null) { return HttpNotFound(); } // 通过组织里的UserId字段(假设你的Organization表存了用户ID)找到对应用户 var targetUser = db.Users.SingleOrDefault(u => u.Id == organization.UserId); // 组装ViewModel var viewModel = new OrganizationViewModel { OrganizationId = organization.OrganizationId, Name = organization.Name, AppUser = targetUser // 关键:把用户实例赋值进去 }; return View(viewModel); }
如果是在Create Action里关联当前登录用户,处理方式如下:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(OrganizationViewModel organizationviewmodel) { if (ModelState.IsValid) { var currentUserId = User.Identity.GetUserId(); var currentUser = db.Users.Single(u => u.Id == currentUserId); // 创建新的Organization实体,关联当前用户ID var newOrg = new Organization { Name = organizationviewmodel.Name, UserId = currentUserId // 其他必填字段按需赋值 }; db.Organizations.Add(newOrg); db.SaveChanges(); // 若需要在返回视图中显示当前用户信息,赋值给ViewModel organizationviewmodel.AppUser = currentUser; return RedirectToAction("Details", new { id = newOrg.OrganizationId }); } // 验证失败时,确保ViewModel包含当前用户数据(如果视图需要显示) organizationviewmodel.AppUser = db.Users.Single(u => u.Id == User.Identity.GetUserId()); return View(organizationviewmodel); }
2. 让视图正确显示用户名
ViewModel数据填充好后,在Razor视图里就能直接访问AppUser的属性了,示例代码如下:
<div class="container"> <h2>Organization Info</h2> <div class="row"> <div class="col-md-6"> <dl class="dl-horizontal"> <dt>Organization Name</dt> <dd>@Html.DisplayFor(model => model.Name)</dd> <dt>Created By</dt> <dd>@Model.AppUser.UserName</dd> <!-- 如需显示邮箱,可写@Model.AppUser.Email --> </dl> </div> </div> </div>
3. 避坑小贴士
- 防止空引用错误:如果EF启用了懒加载,可能出现视图中
AppUser为null的情况。可以在查询组织时用Include提前加载关联用户数据:
(前提是var organization = db.Organizations.Include(o => o.AppUser).Find(id);Organization实体已定义AppUser导航属性) - 轻量化ViewModel:如果仅需显示用户名,无需传递整个
ApplicationUser实例。可以直接在OrganizationViewModel中添加string UserName属性,控制器仅赋值用户名即可,更高效:public class OrganizationViewModel { public string UserName { get; set; } public int OrganizationId { get; set; } public string Name { get; set; } } - 异常防护:查询用户时建议用
SingleOrDefault替代Single,并判断是否为null,避免因用户不存在导致的异常。
内容的提问来源于stack exchange,提问作者Rocky ram
相关产品推荐
相关产品推荐

