【问题标题】:View Model Questions [closed]查看模型问题[关闭]
【发布时间】:2014-05-08 02:14:38
【问题描述】:

我们有一些视图模型,其中包含在视图模型中的验证被复制到控制器中。除此之外,我们还有一些逻辑,我不确定它是否适合视图模型或控制器。

  1. viewModel 是否验证客户端和服务器级别,如果是这样的话 自动还是我们需要实现一些东西。
  2. 需要调用 db 来检查可用性的用户名字段应该 此验证在控制器的视图模型或 httppost 中。

提前致谢。

【问题讨论】:

  • 这怎么不清楚。 1. viewModel 是否同时验证客户端和服务器级别,如果这是自动的还是我们需要实现某些东西。答案是肯定的,已经回答了。 2. 如果此验证在控制器的视图模型或 httppost 中,则需要调用 db 来检查可用性的用户名字段。答案还没有回答。

标签: asp.net asp.net-mvc viewmodel


【解决方案1】:

如果您使用标准 ASP.NET MVC 模型验证提供程序:

  1. 是的,但只有预定义的一组规则,如Required 或 Range,它们具有相同的客户端和服务器端实现,请注意应启用客户端验证(包括验证 js 文件,设置 appSettings 参数)。
  2. 这取决于实际应用程序,但主要是业务逻辑应该是控制器处理的一部分,但在某些情况下,您可以尝试Remote 验证属性。

还可以查看 FluentValidation 作为一个很好的替代实现。

【讨论】:

    【解决方案2】:
    1. 如果您使用验证属性,那么这两个属性都会出现。客户端验证是一个不错的功能,但不应依赖。服务器端验证至关重要。
    2. 我认为这是一个业务规则,而不是验证。验证应该只是检查输入是否有效(即它是字符串还是整数,是否在最小和最大范围内?)。验证应该简单而简约。检查用户名是否有效或是否已经存在是一项业务规则,应该是一个单独的问题。

    【讨论】:

      【解决方案3】:

      查看System.ComponentModel.DataAnnotations 以获取可能对您有所帮助的验证。

      对数据库的调用不应在 UI 级别。将数据库使用与表示逻辑分开。不要在视图模型中这样做,也不要在控制器中这样做(如果可以避免的话)。最好让控制器在引用数据层的域服务层(业务逻辑层)调用一些东西。

      【讨论】:

        【解决方案4】:

        这可能会因情况而异,但作为一般规则,如果您使用来自 ASP.NET MVC(包括 jQuery.Validate.Unobtrusive)的默认项/脚本,如下所示:

        viewModel 是否验证客户端和服务器级别,如果这是自动的还是我们需要实现某些东西。

        是和不是。取决于你的case/project/referenced scripts/rules used。在您的项目中应该有一个jquery.validate.unobtrusive.js 项以及一个jquery.validate.js,当然还有一个jquery.js 用于自动进行客户端验证(不显眼)。

        但客户端验证规则是有限的,它们不会验证所有内容。另一方面,您可以很容易地扩展它。当客户端不支持验证规则并且您不实施该规则时,它将仅在服务器端进行验证。

        不显眼的验证可帮助您进行自动客户端验证,而不是手动检查每个字段的有效输入/选择。它并不完美,但在大多数情况下应该可以正常工作。

        如果此验证位于控制器的视图模型或 httppost 中,则需要调用 db 来检查可用性的用户名字段。

        对此没有“通用规则”,因为有些人会争辩说与数据库相关的方法必须在存储库中,有些人会允许它在控制器上,因为这与验证有关,所以有些人会在验证规则内对其进行验证.

        我打算将这种规则放入控制器或存储库中,后者看起来更好适合您。

        在我们的项目中,当我们有一些额外的有效性相关检查需要任何 db 调用时,它们会调用控制器上的一个方法,该方法将调用委托给存储库。这允许我们在需要时从客户端和服务器端调用相同的方法(例如:在输入用户名后检查是否已经使用了用户名)。

        最后的考虑

        就我个人而言,我不喜欢 DataAnnotations。我曾经,但现在不是了,因为很难继续进行具有复杂多重验证等的大型项目。

        我建议您选择FluentValidation,它具有流畅的界面并且可扩展。它还允许客户端和服务器端验证,并允许您以友好的方式执行复杂的任务。

        例如,我们创建了一个自定义规则(带有它的客户端部分)来检查已注册的电子邮件,该规则调用一个控制器并接收一个 json 结果来解析和验证该字段。这样,我们只需一个 RuleFor(_account => _account.Email).NotAlreadyTaken(),电子邮件在客户端和服务器端都经过验证,您可以通过 ModelState.IsValid 得到它,就像使用 DataAnnotations 一样。

        但在您询问是否使用 DataAnnotations 无法实现(或其他人来这里说这是可能的)之前,是的,如果没有 FluentValidation,这是可能的。我认为这更像是个人选择。

        FluentValidation 的有趣之处在于,您可以仅拥有一个带有验证的单独程序集,并使用 Ninject 或任何其他 IoC 提供所有验证。

        无论如何,请查看this tutorial 了解如何开始使用 DataAnnotations 进行客户端验证,或查看FluentValidation website 以开始使用 FluentValidation。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-22
          • 2017-04-17
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 2018-04-15
          • 1970-01-01
          • 2010-11-17
          相关资源
          最近更新 更多