为什么我会收到 NullReferenceException
Why am I getting a NullReferenceException
我正在扩展 ApplicationUser
class 一些我需要在我的应用程序中使用的额外信息和关系。
这是我的 ApplicationUser
class:
public class ApplicationUser : IdentityUser
{
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Full Name")]
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
[Display(Name = "Job Title")]
public string JobTitle { get; set; }
public virtual ICollection<Permission> Permissions { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("FullName", this.FullName));
return userIdentity;
}
}
我的Permission
模特:
public class Permission : BaseEntity
{
public int ID { get; set; }
public string Name { get; set; }
// Many to One
public virtual ICollection<ApplicationUser> Users { get; set; }
}
我的 Create()
方法在我的 UsersController
:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(CreateUserViewModel model)
{
var selectedPermissions = model.Permissions.Where(x => x.IsChecked).Select(x => x.ID).ToList();
if (ModelState.IsValid)
{
var user = new ApplicationUser {
UserName = model.Email,
Email = model.Email,
PrivateEmail = model.PrivateEmail,
FirstName = model.FirstName,
LastName = model.LastName,
JobTitle = model.JobTitle
};
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// Remove all existing Roles
var userRoles = await UserManager.GetRolesAsync(user.Id);
var uRoles = String.Join(", ", userRoles.ToArray());
await UserManager.RemoveFromRolesAsync(user.Id, uRoles);
// Add selected Role
await UserManager.AddToRoleAsync(user.Id, model.Role);
foreach (var permissionID in selectedPermissions)
{
var permission = await db.Permissions.FindAsync(permissionID);
if (permission != null)
{
user.Permissions.Add(permission);
}
}
await UserManager.UpdateAsync(user);
return RedirectToAction("Index", "Default");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
var allPermissions = await db.Permissions.ToListAsync(); // returns List<Permission>
var checkBoxListItems = new List<CheckBoxListItem>();
foreach (var permission in allPermissions)
{
checkBoxListItems.Add(new CheckBoxListItem()
{
ID = permission.ID,
Display = permission.Name,
IsChecked = selectedPermissions.Contains(permission.ID)
});
}
model.Permissions = checkBoxListItems;
PopulateRolesDropDownList(model.Role);
return View(model);
}
所以在发布创建新用户的表单时,用户被保存到数据库中,所选角色也被保存。但是当它到达 user.Permissions.Add(permission);
行时,它失败并显示错误:
System.NullReferenceException: Object reference not set to an instance of an object.
我添加了断点,可以看到当到达失败行时,user
或 permission
都不为 null。
如果有人能告诉我为什么会出现此错误,我将不胜感激?
听起来 user.Permissions 是空的。
编辑:改写为答案,而不是问题。 :-)
我正在扩展 ApplicationUser
class 一些我需要在我的应用程序中使用的额外信息和关系。
这是我的 ApplicationUser
class:
public class ApplicationUser : IdentityUser
{
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Display(Name = "Full Name")]
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
[Display(Name = "Job Title")]
public string JobTitle { get; set; }
public virtual ICollection<Permission> Permissions { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("FullName", this.FullName));
return userIdentity;
}
}
我的Permission
模特:
public class Permission : BaseEntity
{
public int ID { get; set; }
public string Name { get; set; }
// Many to One
public virtual ICollection<ApplicationUser> Users { get; set; }
}
我的 Create()
方法在我的 UsersController
:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(CreateUserViewModel model)
{
var selectedPermissions = model.Permissions.Where(x => x.IsChecked).Select(x => x.ID).ToList();
if (ModelState.IsValid)
{
var user = new ApplicationUser {
UserName = model.Email,
Email = model.Email,
PrivateEmail = model.PrivateEmail,
FirstName = model.FirstName,
LastName = model.LastName,
JobTitle = model.JobTitle
};
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// Remove all existing Roles
var userRoles = await UserManager.GetRolesAsync(user.Id);
var uRoles = String.Join(", ", userRoles.ToArray());
await UserManager.RemoveFromRolesAsync(user.Id, uRoles);
// Add selected Role
await UserManager.AddToRoleAsync(user.Id, model.Role);
foreach (var permissionID in selectedPermissions)
{
var permission = await db.Permissions.FindAsync(permissionID);
if (permission != null)
{
user.Permissions.Add(permission);
}
}
await UserManager.UpdateAsync(user);
return RedirectToAction("Index", "Default");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
var allPermissions = await db.Permissions.ToListAsync(); // returns List<Permission>
var checkBoxListItems = new List<CheckBoxListItem>();
foreach (var permission in allPermissions)
{
checkBoxListItems.Add(new CheckBoxListItem()
{
ID = permission.ID,
Display = permission.Name,
IsChecked = selectedPermissions.Contains(permission.ID)
});
}
model.Permissions = checkBoxListItems;
PopulateRolesDropDownList(model.Role);
return View(model);
}
所以在发布创建新用户的表单时,用户被保存到数据库中,所选角色也被保存。但是当它到达 user.Permissions.Add(permission);
行时,它失败并显示错误:
System.NullReferenceException: Object reference not set to an instance of an object.
我添加了断点,可以看到当到达失败行时,user
或 permission
都不为 null。
如果有人能告诉我为什么会出现此错误,我将不胜感激?
听起来 user.Permissions 是空的。
编辑:改写为答案,而不是问题。 :-)