Simplemembership-добавление поля электронной почты и использование в качестве логина
Я пытаюсь сделать здесь две вещи:
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);
Я более или менее следую руководство найдено здесь , В разделе комментариев я вижу, что другие имеют ту же проблему, однако, решение не состоит в том, чтобы установить поле UserName для разрешения нулей, как указано в ответах.
Самое странное, что все работает до тех пор, пока я не использую оба вместе. Есть идеи? Это сводит меня с ума!Заранее спасибо
Edit : может быть, это порядок столбцов в базе данных? Тот поле, используемое для идентификации, должно быть первым столбцом в таблице? Итак, если я хочу, чтобы электронная почта была идентификатором, который должен быть первым столбцом в таблице?
2 ответа:
Это не порядок столбцов. Я думаю, что вы не настроили свой
В любом случае, это просто сделать работу. Если у вас уже есть столбец электронной почты в базе данных и вы используете стандартный шаблон интернет-приложения, выполните следующие действия. следующее:WebSecurity.InitializeDatabaseConnectionдолжным образом. Похоже, что когда вы добавляете поле электронной почты, оно рассматривается как поле электронной почты (а не естественный ключ для пользователей), и когда вы изменяете логин для использования электронной почты, вы фактически вставляете электронную почту в столбец имя пользователя?
- измените модель
UserProfile, чтобы добавить свойствоRegisterModelи измените модельLoginсUserNameна- обновите
InitializeSimpleMembershipAttribute, чтобы использовать электронную почту вместоUserNameв качестве естественного ключа для пользователей- обновить
AccountControllerLoginиRegisterдействия, чтобы вы захватили имя пользователя и электронную почту при регистрации, и использовали электронную почту при входе в систему- обновить представления
Итак, фактические изменения, которые необходимо внести являются:
- Модели / AccountModels.изменения cs
class UserProfile: добавьте свойствоpublic string Email { get; set; }class LoginModel: измените имя свойства сUserNameна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 });- EDIT-пропущено изменение: Изменить
WebSecurity.Login(model.UserName, model.Password);наWebSecurity.Login(model.Email, model.Password);- Filters/InitializeSimpleMembershipAttribute.изменения cs
- изменить
"UserName"на"Email"вWebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);- Просмотры / Учетная Запись / Логин.cshtml
- измените три вида использования
m.UserNameнаm.Email- Просмотры / Учетная Запись / Регистр.cshtml
- скопируйте и вставьте раздел UserName
<li>и измените дубликатыm.UserNameвm.EmailВ проекте vanilla Internet Application MVC 4 эти изменения будут работать идеально (в истинном проекте vanilla вам, возможно, придется применить миграции, если вы хотите использовать их, и вы не редактируете базу данных, чтобы добавить столбец электронной почты).
Я не уверен, что предложение Энди Браунса сработает, потому что WebSecurity в пространстве имен WebMatrix.В результате ссылки на WebData не будут работать корректно. Они специально смотрят на поле имени пользователя, чтобы выполнить свои действия. Я могу ошибаться, но таково мое восприятие. Если вам нужно отдельное поле, создайте другое поле имени пользователя (Name) и запустите свой собственный код, чтобы обновить его для отражения пользователю.
Я решил настроить представление регистрации, переименовав имя Пользователя в адрес электронной почты пользователя
<li> @Html.Label("Email Address:") @Html.TextBoxFor(m => m.UserName) </li>А затем в модели входа и регистрации просто требуется имя пользователя, введенное в формате электронной почты с использованием:
[Required] [DataType(DataType.EmailAddress)] [EmailAddress] [Display(Name = "UserEmail")] public string UserName { get; set; }Может быть, слишком упрощенно, но это работает для меня.