Обновить только часть модели, проблема с проверкой? - PullRequest
1 голос
/ 24 августа 2010

У меня есть страница регистрации, где пользователь может ввести свои имя, фамилию, адрес электронной почты и пароль, а также другие поля.

Я связал атрибуты проверки с этой моделью (называемые «Пользователь» и созданные через LINQtoSQL), и все работает хорошо.

Код модели:

[MetadataType(typeof(UserValidation))]
public partial class User { }

[Bind(Exclude = "UserID")]
[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")]
public class UserValidation 
{
    [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last name required"), StringLength(20, MinimumLength = 3, ErrorMessage = "Must be between 3 and 20 characters")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Email address required"), RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Must be a valid email address")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")]
    public string Password { get; set; }

    [Required(ErrorMessage = "Confirm password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")]
    public string ConfirmPassword { get; set; }

}

После регистрации и входа в систему я хочу, чтобы пользователь мог редактировать свои FirstName, LastName и Email (давайте назовем эти поля «Account») в одном представлении и «Password» в другом. Вот где моя проблема.

Когда я отправляю форму, обновляющую данные полей учетной записи через ту же модель («Пользователь»), которая использовалась при регистрации, метод IsValid выдает ошибку ModelState для отсутствующего поля «Пароль».

Код контроллера:

    //
    // GET /Talent/Account
    public ActionResult Account()
    {
        string cookieUser = User.Identity.Name;
        User user = userRepository.GetUserByEmail(cookieUser);
        return View(user);
    }

    // POST /Talent/Account
    [HttpPost]
    public ActionResult Account(User model)
    {

        if (ModelState.IsValid)
        {
    // do something
            ModelState.AddModelError("", "All good.. "+ model.FirstName + " - " + model.LastName);
        }

        return View(model);
    }

Как я могу обойти это ?? Лучшие практики и т.д ...

1 Ответ

4 голосов
/ 24 августа 2010

В режиме Model-View-ViewModel (MVVM) вы должны создать две ViewModel: одну для создания новой учетной записи, а другую для редактирования полей имени без ввода пароля.

Примените атрибуты проверки к вашим моделям представления вместо непосредственных к вашим моделям.

Некоторые примеры классов обёртки ViewModel:

        [Bind(Exclude = "UserID")]    
        public class UserForAccountEdit
        {
            public User UserAccount { get; set; }

            [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]  
            public string FirstName  
            {  
              get 
                   { return UserAccount.FirstName };  
              set
                   { UserAccount.FirstName = value; }
            }  

            ...
        }    



        [Bind(Exclude = "UserID")]
        [PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")]
        public class UserForAccountCreation
        {
            public User UserAccount { get; set; }

            [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]  
            public string FirstName  
            {  
              get 
                   { return UserAccount.FirstName };  
              set
                   { UserAccount.FirstName = value; }
            }  

            ...
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...