Редактирование данных профиля пользователя
Как создать действие и представления для редактирования пользовательских данных?
Авторизация основана на членстве, созданном VS с проектом MVC 4.
Я добавил дополнительные столбцы, такие как FirstName и т. Д. Мне нужно, и регистрация работает правильно, но я не знаю, как получить эти атрибуты для отображения в поле зрения @Html.EditorFor
и сохранить изменения в базе данных (таблица UserProfile).
Большое спасибо за каждый совет.
Создана модель для издания:
public class UserProfileEdit
{
[Required]
[Display(Name = "First name")]
public string FirstName { get; set; }
[Required]
[Display(Name = "Last name")]
public string LastName { get; set; }
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
2 ответа
Таким образом, вы хотите страницу редактирования для редактирования личной информации пользователя. Дополнительные столбцы уже добавлены в таблицу UserProfile.
Прежде всего, вам нужен метод действия для редактирования. Получите пользователя из базы данных и постройте свою модель UserProfileEdit.
public ActionResult Edit()
{
string username = User.Identity.Name;
// Fetch the userprofile
UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.Equals(username));
// Construct the viewmodel
UserProfileEdit model = new UserProfileEdit();
model.FirstName = user.FirstName;
model.LastName = user.LastName;
model.Email = user.Email;
return View(model);
}
Когда мы публикуем форму редактирования, мы публикуем модель UserProfileEdit. Мы снова получаем UserProfile из базы данных и меняем опубликованные поля.
[HttpPost]
public ActionResult Edit(UserProfileEdit userprofile)
{
if (ModelState.IsValid)
{
string username = User.Identity.Name;
// Get the userprofile
UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.Equals(username));
// Update fields
user.FirstName = userprofile.FirstName;
user.LastName = userprofile.LastName;
user.Email = userprofile.Email;
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index", "Home"); // or whatever
}
return View(userprofile);
}
Теперь это просто кодирование на ваш взгляд. Моя выглядит так:
@model UserProfileEdit
@using (Html.BeginForm("Edit", "Account"))
{
@Html.EditorFor(model => model.FirstName)
@Html.EditorFor(model => model.LastName)
@Html.EditorFor(model => model.Email)
<input type="submit" value="Save" />
}
Automapper может помочь, если у вас есть тонны полей для вашей модели редактирования. Это решение редактирует текущего вошедшего в систему пользователя, но добавление имени пользователя в качестве параметра действия довольно тривиально.
Для добавления дополнительных свойств в таблицу UserProfile вам нужно будет изменить ряд изменений в
- Класс таблицы UserProfile
- Класс RegisterModel
- RegisterView (где вы будете добавлять ввод для нового поля)
- AccountController / Register action (чтобы прочитать новое входное значение и использовать соответственно)
1. Измените свой класс UserProfile
Здесь, в этом примере, я добавляю новое поле с именем "MobileNumber", объявив его как строку типа.
[Table("UserProfiles")]
public class UserProfiles
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set;}
public string Email { get; set;}
public string FirstName { get; set; }
public string LastName { get; set; }
public string MobileNumber { get; set; }
}
2. Добавьте дополнительные свойства в ваш RegisterModel.cs
Добавьте новое свойство в вашу модель. В этом примере, где нам нужно дополнительное поле при регистрации пользователя, нам нужно обновить RegisterModel
учебный класс. Добавьте проверки в случае необходимости.
public class RegisterModel
{
[Required]
[Display(Name = "Email")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required]
[StringLength(11, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 11)]
[Display(Name = "Mobile No.")]
public string MobileNumber { get; set; }
}
3. Отображение дополнительных полей в вашем представлении
Как только вы обновите модель, вы сможете использовать @Html.TextBoxFor(m => m.MobileNumber)
на ваш взгляд, который будет связывать MobileNumber
поле для вашего свойства 'MobileNumber', объявленного в вашей модели.
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.LabelFor(m = m.Email)
@Html.TextBoxFor(m => m.Email)
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.LabelFor(m => m.MobileNumber)
@Html.TextBoxFor(m => m.MobileNumber)
<input type="submit" value="Register">
}
4. Обновите свой контроллер - (AccountController в этом случае)
Последний шаг, здесь вам просто нужно прочитать значение, опубликованное в вашей модели, и передать его в хранилище для сохранения.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.Email, model.Password,
new
{
FirstName = model.FirstName,
LastName = model.LastName,
MobileNumber = model.MobileNumber
});
WebSecurity.Login(model.Email, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
5. Получите это значение обратно из БД и на ваш взгляд
Теперь, так как ваш RegisterModel уже имеет это свойство и ваш класс UserProfile, используя класс RegisterModel в вашем представлении, вы сможете получить доступ к новому добавленному свойству.
Взято отсюда: Как добавить дополнительные поля при использовании Членства в ASP.NET MVC 4