我有一个注册页面,想对重复的用户名和电子邮件地址执行一些验证(除了我的 ViewModel 上的 StringLength 和 Required 注释)。目前,当回发注册表单时,我在我的控制器中执行此验证。我不确定这是否是正确的地方。
我无法想象 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
似乎将验证逻辑放在控制器中最有意义,因为它可以在远程验证和提交时的模型验证中重用。像检查重复这样的事情通常应该在控制器中完成,还是在域模型中进行此类检查是否有意义?
谢谢,