我使用MVC5和 ASP.NET 身份框架。
我扩展了VS2013脚手架的帐户管理功能。
如果我的用户已向外部登录提供程序注册,并且想要添加本地密码,则在调用"AddPasswordAsync()"时出现错误:"名称不能为空或空"
我已经查看了我的数据库并确认用户名不为空。
此错误是什么意思?
我的应用程序用户如下所示:
public class Person : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Sex Sex { get; set; }
[Display(Name = "Birth date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime Birthdate { get; set; }
public string EMail { get; set; }
public int PostalCode { get; set; }
public Collection<Race> Races { get; set; }
public Collection<Participation> Participations { get; set; }
public Person()
{
if (string.IsNullOrEmpty(UserName))
{
UserName = EMail;
}
Participations = new Collection<Participation>();
Races = new Collection<Race>();
Birthdate = DateTime.Now;
}
}
此致敬意Frederik
经过多次尝试,我终于解决了它。错误消息是错误的,它来自数据库,意味着用户名字段为空,但数据库需要它。
确保向数据库发送用户名,例如:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Hometown = model.Hometown };
并通过运行更新数据库确保数据库在此之前是最新的。
好吧,我希望你的ApplicationUser
能引出更多关于问题是什么的线索,但我没有看到任何突出的东西。所以,这是我能给出的建议。这不是在问UserName
;它明确表示"名称是必需的"。 AddPasswordAsync
只是将用户对象保存到数据库中,因此您需要更深入地查看并确保整个对象是干净的,即没有验证错误。某些地方的验证失败,所以我的第一步是运行一个项目,甚至是解决方案范围内的搜索"名称"。不幸的是,对于像这样一般的事情,您可能会收到大量的误报,但是当您最终找到具有该名称的一个或多个属性时,这很可能是您的罪魁祸首。
我尝试复制您的问题,我认为错误不在您的应用程序用户中。我认为问题在于您尝试创建用户时。因为在您的 Person 构造函数中,您分配的用户名等于 EMail(我认为您不需要该行)。但身份在创建实例之前验证用户名。我做了和你一样的例子,用这行我得到了同样的错误:
//With out UserName property
var usertemp = new ApplicationUser() {
Profile_Id = "admin",
Email = "rommelmeza@gmail.com",
FirstName = "Rommel",
LastName = "Meza",
Password = model.Password,
Active = true
};
var result = await UserManager.CreateAsync(usertemp, model.Password);
// Error Name cannot be null or empty
您需要显式添加用户名属性:
//With UserName property
var usertemp = new ApplicationUser() {
Profile_Id = "admin",
UserName = "rommelmeza@gmail.com",
Email = "rommelmeza@gmail.com",
FirstName = "Rommel",
LastName = "Meza",
Password = model.Password,
Active = true
};
var result = await UserManager.CreateAsync(usertemp, model.Password);
// Success!!!
它对我有用。