Редактирование данных профиля пользователя

Как создать действие и представления для редактирования пользовательских данных?

Авторизация основана на членстве, созданном 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

Другие вопросы по тегам