我使用MVC5和ASP.NET身份框架。
我扩展了VS2013搭建的帐户管理功能。
如果我的用户已向外部登录提供商注册并想要添加本地密码,则在调用“AddPasswordAsync()”时出现错误:“名称不能为空或空”
我查看了我的数据库并确认用户名不为空。
这个错误是什么意思?
我的ApplicationUser如下所示:
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;
}
}
祝你好运 弗雷德里克
答案 0 :(得分:6)
经过多次尝试,我终于解决了这个问题。错误消息是错误的,它来自数据库,意味着username字段为null但数据库需要它。
确保向db发送类似的用户名,例如:
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Hometown = model.Hometown };
通过运行update-database确保数据库在此之前是最新的。
答案 1 :(得分:1)
好吧,我希望你的ApplicationUser
能够找到更多关于问题的线索,但我没有看到任何突出的东西。所以,这是我能给出的建议。它并不是在询问UserName
;它明确地说“姓名是必需的”。 AddPasswordAsync
仅将用户对象保存到数据库,因此您需要更深入地查看并确保整个对象是干净的,即没有验证错误。某些东西,某处是失败的验证,所以我的第一步是运行项目甚至解决方案范围内的“名称”搜索。不幸的是,你可能会得到一些 ton 的误报,但是当你最终找到一个具有该名称的属性时,这很可能是你的罪魁祸首。
答案 2 :(得分:0)
您好我尝试复制您的问题,我认为错误不在您的ApplicationUser中。我认为问题是当你尝试创建用户时。因为在您的Person构造函数中,您将UserName指定为等于EMail(我认为您不需要那些行)。但Identity在创建实例之前验证UserName。我做了同样的例子,这行我得到了同样的错误:
//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
您需要显式添加UserName属性:
//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!!!
它适用于我。