回答

收藏

Simplemembership-添加电子邮件字段作为登录名称

技术问答 技术问答 85 人阅读 | 0 人回复 | 2023-09-14

我试着在这里做两件事:. g8 m( a# y& b1 b
1.    在(默认)中添加电子邮件字段UserProfile表。奇迹般有效。用户可以注册用户名和电子邮件。  k3 q5 S% A& |( e, Z  I' w
2.    用电子邮件代替用户名更改登录名,也可以像超级按钮一样工作。
: }2 g2 j" U) L! y# e( ^5 ^) A这就是问题所在。以上只有在我把它们分开的时候才有效,一旦我同时用它们 ,注册过程会失败,    并显示以下 错误消息:5 ]  a4 D% }5 G
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);或多或少遵循 此处找到    的 指南    ,在评论部分,我看到其他人也有同样的问题,但解决方案不是UserName允许答复中所述的空值设置为字段。% F) H' S2 V. C7 u' J6 v
奇怪的是,只要我不一起用,一切都会正常。你有什么想法吗?这让我疯了!' Q0 R6 j5 t, B" a
提前致谢
& I2 V) l3 {: E' V( o# n+ d( r编辑    :可以是数据库中列的顺序吗?用于识别的字段需要在表的第一列吗?所以,如果我想用电子邮件作为标识,我需要把它作为表的第一列。* u# k1 ^# c0 @7 e
                                                               
  W1 n( x, k+ y) r8 |; y& m4 w1 _    解决方案:                                                                ) v, I' b, J5 X6 I
                                                                这不是顺序。我认为你的设置WebSecurity.InitializeDatabaseConnection不正确。在添加电子邮件字段时,它似乎被视为电子邮件字段(而不是用户的自然键),当您更改登录名称以使用电子邮件时,您实际上正在插入电子邮件UserName列中吗?, S0 Q$ b0 W+ Z  o
无论如何,生产工作都很简单。假设您的电子邮件列已经在数据库中,您正在使用标准Internet请执行以下操作:" w& P4 k% |2 H: y! Z" S6 u# l
[ol]更改UserProfile模型以添加Email属性,同样的操作,RegisterModel然后将Login模型从更改UserName为Email
( V) J  R+ a7 X: b6 t更新 InitializeSimpleMembershipAttribute用电子邮件代替UserName用户的自然键: h9 @$ q- I& O) ~3 k. g2 R' w9 G
更新AccountController Login和Register注册时捕获用户名和电子邮件,登录时使用电子邮件" F2 E$ y+ w# a# ]$ m/ K
更新视图[/ol]因此,实际的变化是:' v* A3 q% H0 l1 m8 p5 ~7 ?
模型/AccountModels.cs的更改
- B6 ]/ w+ X# K! B7 ~! S8 [( t7 O5 x# qclass UserProfile:添加属性 public string Email { get; set; }
& E# Y& z% q9 S/ qclass LoginModel:更改属性名称UserName为Email% x& i& Y0 o  P7 J; z/ X
class RegisterModel:添加属性public string Email { get; set; }并将其属性设置为Required,设置Display(Name等待(如果也需要强制执行,则为最大长度

3 G+ _2 P. |! }4 MAccountController 变化 ; I3 c' a& f# q, A
Login 方法: , `" O3 H1 A/ Q
更改model.UserName至model.Email该行if (ModelState.IsValid && WebSecurity.Login(model.UserName ...
1 g3 Z5 o# D% C" L; O, |. p( cRegister 方法:   u! [1 F/ l" P" u
更改WebSecurity.CreateUserAndAccount(model.UserName,model.Password);为WebSecurity.CreateUserAndAccount(model.Email,model.Password,new { UserName = model.UserName });, R; k/ v$ I! H8 U1 y7 t
编辑-错过更改:    更改WebSecurity.Login(model.UserName,model.Password);为WebSecurity.Login(model.Email,model.Password);

  e) l4 x8 V+ R: ~  n0 Y筛选器/InitializeSimpleMembershipAttribute.cs的更改
) K0 X6 _; h" b* E, G  }更改"UserName"到"Email"在WebSecurity.InitializeDatabaseConnection("DefaultConnection","UserProfile","UserId","UserName",autoCreateTables: true);

$ H9 D/ v9 _1 D! h! e$ e" n7 v& v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Login.cshtml 0 O/ Q2 k4 s0 K- h) K4 f) q
更改三种用法m.UserName为m.Email
- `' J% u6 E. ~# `/ |* b- `
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Register.cshtml
0 |" h" C  p; T. q* i4 J) M复制并粘贴UserName! Y  f. ?0 a/ N$ C, c
部分将重复项改为 m.UserName为m.Email
在普通的Internet应用程序MVC: a2 ^+ s5 P" I
在4个项目中,这些变化将起到完美的作用(在真正的普通项目中,如果要使用这些变化而不编辑数据库来添加电子邮件列,则可能需要应用迁移)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则