asp.net-mvc - 执行验证 : ViewModel, 模型或 Controller 的推荐位置是什么?

标签 asp.net-mvc asp.net-mvc-2-validation

我有一个注册页面,想对重复的用户名和电子邮件地址执行一些验证(除了我的 ViewModel 上的 StringLength 和 Required 注释)。目前,当回发注册表单时,我在我的 Controller 中执行此验证。我不确定这是否是正确的地方。

我无法想象 ViewModel 是正确的位置,因为它需要 ViewModel 引用我的 UserRepository。在模型类中进行这种验证有意义吗?

如果是这样,我如何在模型上实现它,以便在将信息发送到我的存储库之前检查信息是否有效?

更新

我的 Controller 操作代码:

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

域模型是否应该关心诸如重复的用户名或电子邮件地址之类的约束,或者这是 Controller 层应该担心的事情?

更新 3

似乎将验证逻辑放在 Controller 中最有意义,因为它可以在远程验证和提交时的模型验证中重用。检查重复项之类的事情通常应该在 Controller 中完成,还是在域模型中进行此类检查是否有意义?

谢谢,

最佳答案

我会在前端(也许是 ajax)和后端执行它——这取决于您的解决方案架构。

我喜欢让用户立即知道是否会有注册问题。
在我的数据层/业务层和表示层的典型设置中,我将在业务逻辑中执行 dup 检查,并让 Controller 调用那段代码(除了在前端为用户进行 ajax 查找)。

附带说明一下:我通常更喜欢在 Windows 应用程序中只使用 MVVM(带有 View 模型)。将 MVC 与 MVVM 相结合会使事情变得不必要地复杂

关于asp.net-mvc - 执行验证 : ViewModel, 模型或 Controller 的推荐位置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5163270/

相关文章:

asp.net-mvc - Visual Studio - MVC 查找 DisplayTemplate/EditorTemplate 的用法

c# - 将文件从 MVC 发布到 WEB API

c# - Controller 和 Action 名称 - 编译器验证

asp.net-mvc - 支持使用 ASP.NET MVC 2.0 进行嵌套模型和类验证

.net - ASP.NET MVC AJAX 文档在哪里?

c# - 为什么角色即使存在于数据库中也显示为 "not exist"(asp.net mvc)

ajax - asp .net MVC 中的模型验证

c# - MVC 2 - 如何在创建方法中排除多列

c# - 如何验证 MVC2 表单中的多选?

ASP.NET MVC : DropDownList validation