我想在这里做两件事:
1。将电子邮件字段添加到(默认)UserProfile表。 奇迹般有效。 用户可以注册用户名和电子邮件。
2。更改登录信息以使用电子邮件而不是用户名,这也像魅力一样。
这是问题所在。只有在我使用它们注册过程失败并且以下错误消息
时,上述内容才有效。Cannot insert the value NULL into column 'UserName', table 'opdb.dbo.UserProfile'; column does not allow nulls. INSERT fails.
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email
});
WebSecurity.Login(model.Email, model.Password);
我或多或少跟随着 guide found here, 在评论部分,我看到其他人遇到了同样的问题,但是,解决方法是不要将UserName字段设置为允许回复中所述的空值。
奇怪的是,只要我不同时使用它们,一切都会有效。有任何想法吗?这让我抓狂!
提前致谢
修改:它可能是数据库中列的顺序吗?用于识别的字段需要是表格中的第一列吗?那么,如果我想将电子邮件作为身份,需要成为表格中的第一列?
答案 0 :(得分:5)
这不是列顺序。我认为您没有正确设置WebSecurity.InitializeDatabaseConnection
。这听起来像是在添加电子邮件字段时,它被视为电子邮件字段(而不是用户的自然键),当您更改登录以使用电子邮件时,您实际上是将电子邮件插入UserName列?
无论哪种方式,工作都很简单。假设您已在数据库中拥有电子邮件列,并且使用的是标准Internet应用程序模板,请执行以下操作:
UserProfile
模型以添加Email
属性,对RegisterModel
执行相同操作,并将Login
模型从UserName
更改为{{1 }} Email
以使用电子邮件而不是InitializeSimpleMembershipAttribute
作为用户的自然密钥UserName
AccountController
和Login
操作,以便在注册时捕获用户名和电子邮件,并在登录时使用电子邮件所以,实际的变化是:
Register
:添加属性class UserProfile
public string Email { get; set; }
:将属性名称从class LoginModel
更改为UserName
Email
:添加属性class RegisterModel
并将其属性设置为public string Email { get; set; }
,设置Required
等。(如果您想要强制执行此操作,还需要最大长度Display(Name
更改
AccountController
方法:
Login
model.UserName
更改为model.Email
if (ModelState.IsValid && WebSecurity.Login(model.UserName ...
方法:
Register
更改为WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
WebSecurity.CreateUserAndAccount(model.Email, model.Password, new { UserName = model.UserName });
更改为WebSecurity.Login(model.UserName, model.Password);
WebSecurity.Login(model.Email, model.Password);
"UserName"
更改为"Email"
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
的三种用法更改为m.UserName
m.Email
部分,并将重复项<li>
更改为m.UserName
在一个vanilla Internet Application MVC 4项目中,这些更改将完美运行(如果您想要使用这些更改,并且您没有编辑数据库以添加“电子邮件”列,则可能必须应用迁移)。
答案 1 :(得分:2)
我不确定Andy Browns的建议是否有效,因为名称空间WebMatrix.WebData引用中的WebSecurity将无法正常工作。他们专门查看UserName字段以执行其操作。我错了,但这是我的看法。如果您想要一个单独的字段,请创建另一个用户名字段(名称)并运行您自己的代码以更新该字段以反映给用户。
我选择设置一个注册视图,将UserName重命名为User Email
<li>
@Html.Label("Email Address:")
@Html.TextBoxFor(m => m.UserName)
</li>
然后在登录和注册模型中,只需要输入用户名作为电子邮件格式:
[Required]
[DataType(DataType.EmailAddress)]
[EmailAddress]
[Display(Name = "UserEmail")]
public string UserName { get; set; }
可能过于简单,但它对我有用。