3

我有一个注册页面,想对重复的用户名和电子邮件地址执行一些验证(除了我的 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

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

谢谢,

4

5 回答 5

1

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

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

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

于 2011-03-02T04:20:59.927 回答
0

正如 Rob 在评论中所说,它确实取决于您的应用程序的结构。我倾向于进行双重验证(我的 ViewModel 上的验证以及我的服务层上的验证)以确保命中服务的数据是有效的。这很有帮助,因为我的服务被多个客户端使用,但视图和 ViewModel 是特定于客户端的。前端验证具有即时反馈的优势,后端验证有助于保持数据清洁。

于 2011-03-02T04:22:39.980 回答
0

我的建议是 - 对于验证,例如重复的电子邮件地址和用户名 - 将验证方法保留在控制器中。

或者在您的验证层中 - 将在视图模型和数据层之间使用

对于 MVC3,您将能够使用 Remote 属性将控制器中的方法作为操作添加到视图模型中的属性以获得即时结果

于 2011-03-02T04:32:50.617 回答
0

我建议您在控制器中执行此操作。

主要原因是无论应用程序的结构如何,您肯定需要使用 Ajax 来通知用户用户名是否已被使用。否则,它只是糟糕的可用性,不能证明你的代码结构是合理的。

为此,您希望有一个操作方法,可以通过 ajax 方式查看用户名是否存在。

总体而言,这确实意味着您最终可能会得到两组验证方法(UI 和模型),但这一切都是有道理的。

此外,为了制作一个好的可用网站,您肯定会使用 Javascript 框架,如 knockoutjs 或骨干网。那是真正的 MVVM,在这种情况下,让您的 ViewModels 成为模型层类(正如 Chris 所提到的)不是一个好主意。所以基本上你最终会得到两组验证。

于 2011-03-02T05:18:37.397 回答
0

您应该在视图(客户端)和控制器(服务器端)中进行验证。如果你有 MVC 3,你可以使用新的RemoteAttribute。它使用 jQuery 进行服务器端调用,您可以在其中检查用户或电子邮件地址是否存在。

于 2011-03-02T06:28:18.050 回答