Какое рекомендуемое место для проверки: ViewModel, Model или Controller? - PullRequest
3 голосов
/ 02 марта 2011

У меня есть страница регистрации, и я хотел бы выполнить некоторую проверку (в дополнение к аннотациям StringLength и Required в моей ViewModel) для дублированных имен пользователей и адресов электронной почты. В настоящее время я выполняю эту проверку в моем контроллере, когда форма регистрации отправляется обратно. Я не уверен, что это правильное место для этого.

Я не могу представить, что ViewModel является правильным местом, так как для этого требуется, чтобы ViewModel имела ссылку на мой UserRepository. Имеет ли смысл проводить такого рода проверки в модельных классах?

Если это так, как мне реализовать это в модели, чтобы я мог проверить достоверность информации, прежде чем отправлять ее в свой репозиторий?

Обновление

Код действия моего контроллера:

if (ModelState.IsValid)
        {
            if (!_userRepository.Exists(registerViewModel.Username))
            {
                if (!_userRepository.EmailExists(registerViewModel.Email))
                {
                    _userRepository.Add(
                        new User
                            {
                                Created = DateTime.Now, 
                                Email = registerViewModel.Email, 
                                Password = registerViewModel.Password, 
                                Username = registerViewModel.Username
                            });

                    _userRepository.SaveChanges();
                    TempData["registrationDetails"] = registerViewModel;

                    return RedirectToAction("Confirm");
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "This email address is already in use.");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, "This username is already taken.");
            }
        }

        return View(registerViewModel);
    }

Обновление 2

Должна ли модель домена заботиться о таких ограничениях, как повторяющиеся имена пользователей или адреса электронной почты, или об этом должен беспокоиться уровень контроллера?

Обновление 3

Кажется, что использование логики проверки в контроллере имеет смысл, так как ее можно использовать повторно при удаленной проверке и при проверке модели при отправке. Это что-то вроде проверки на дубликаты, как правило, то, что должно быть сделано в контроллерах, или имеет смысл иметь такого рода проверки в доменной модели?

Спасибо

Ответы [ 5 ]

1 голос
/ 02 марта 2011

Я бы выполнил это как на внешнем интерфейсе (возможно, на ajax), так и на внутреннем - что зависит от архитектуры ваших решений.

Мне нравится, чтобы пользователи сразу знали, будут ли проблемы с регистрацией.В моей типичной настройке уровня данных / бизнес-уровня и уровня представления я выполнял бы проверку на дублирование в бизнес-логике и заставлял контроллер вызывать этот фрагмент кода (в дополнение к поиску ajax во внешнем интерфейсе для пользователей).

Как примечание: я обычно предпочитаю использовать только MVVM (с моделями представления) в приложениях Windows.Комбинация MVC с MVVM может усложнить задачу

0 голосов
/ 02 марта 2011

Необходимо выполнить проверку как в представлении (на стороне клиента), так и в контроллере (на стороне сервера).Если у вас MVC 3, вы можете использовать новый RemoteAttribute .Он использует jQuery для выполнения серверного вызова, в котором вы можете проверить наличие пользователя или адреса электронной почты.

0 голосов
/ 02 марта 2011

Я бы посоветовал вам сделать это в контроллерах.

Основная причина в том, что, какой бы ни была структура приложения, вам определенно нужно будет использовать Ajax, чтобы уведомить пользователя, было ли уже взято имя пользователя или нет. В противном случае это просто плохое удобство использования, которое не оправдывает вашу структуру кода.

И для этого вы хотели бы иметь метод действия, который бы мог ajax-ly посмотреть, существует имя пользователя или нет.

В целом, это означает, что у вас может быть два набора метода проверки (пользовательский интерфейс и модель), но все по уважительной причине.

Кроме того, чтобы сделать хороший сайт пригодным для использования, вы определенно должны использовать среду Javascript, такую ​​как knockoutjs или backbone. Это настоящий MVVM, и в этом случае, если ваши ViewModels являются классами слоя модели (как упоминал Крис), это не очень хорошая идея. В общем, в любом случае вы получите два набора валидации.

0 голосов
/ 02 марта 2011

Мое предложение - для проверки, например, дубликата адреса электронной почты и имени пользователя, чтобы сохранить ваши методы проверки в контроллере.

Или на уровне проверки - который будет использоваться между моделью представления и уровнем данных

для MVC3 вы сможете добавлять методы в контроллер как действия, используя атрибут Remote для вашего свойства в модели представления для мгновенных результатов

0 голосов
/ 02 марта 2011

Как сказал Роб в комментариях, это зависит от структуры вашего приложения.У меня, как правило, двойная проверка (проверка на моих ViewModels, а также проверка на уровне службы), чтобы убедиться, что данные, попадающие в службу, действительны.Это помогает, потому что мои службы используются несколькими клиентами, но представления и ViewModels зависят от клиента.Преимущества внешней проверки имеют преимущество мгновенной обратной связи, а проверки внутренней части помогают поддерживать чистоту ваших данных.

...