【问题标题】:How can I approach client-side validation with MVC and WCF without duplicating logic?如何在不重复逻辑的情况下使用 MVC 和 WCF 进行客户端验证?
【发布时间】:2011-06-03 20:10:43
【问题描述】:

我可能在这里寻找一个不存在的圣杯,但值得一试。对于初学者,以下是我们架构的快速概览:

  • 数据访问:通过以下方式与 SQL Server 交互的存储库类 实体框架
  • 业务逻辑:管理器类调用数据层并将数据映射到领域模型
  • 领域模型:代表我们领域的 POCO
  • 服务库/服务外观:公开 POCO 的 CRUD 操作
  • 演示文稿:ASP.NET MVC(v2,但如果需要可以移至 v3 -- 我们仍处于项目的早期阶段)

我们要解决的问题是如何自动创建客户端验证来处理必填字段、最小和最大长度、数字范围等基本问题——这只是您的基本第一道防线东西。

如果我们要在域模型 POCO 上使用 DataAnnotations(一开始听起来很吸引人),我们可以让 jQuery 不显眼的验证为我们完成这项工作。为了使其工作,我们必须在服务层和表示层中引用域模型库,因为 DataAnnotations 不会通过 WCF 传递。不幸的是,我们需要在多个应用程序中重复使用 WCF 服务,如果我们走这条路,我们很可能会产生版本锁定问题。

所以我们不能在服务边界的两边引用域模型,我们也不想将验证规则的定义移动到表示层,因为未来的应用程序可能会使用相同的服务并且验证将是那里也需要。

这让我们寻找另一种方法来将使用域模型定义的验证规则(或验证元数据,如果您愿意)传递给客户端应用程序。

我知道听起来我们也想吃蛋糕。如果没有合理的解决方案,我们将硬着头皮重复验证逻辑。我认为这比紧密耦合我们的应用程序层更可取。

鉴于上述情况,您将如何处理客户端验证并仍避免重复逻辑?

编辑:

感谢到目前为止的想法。还有一个方面,我意识到我在谈论 DataAnnotations 时忘记包括在内:我们研究了使用反射来获取注释并通过对单独服务的方法调用将它们返回,但这不起作用,因为它们不是标记为可序列化,因此不能通过 WCF 返回。

【问题讨论】:

  • 只有一些元资源 (xml/json) 以声明方式声明验证规则。然后为它们编写一个缩放的 c# & js 处理程序。
  • 嗨 Rick .. 正如您在下面的答案中评论的那样,您能否发布示例代码来解决此问题。我也面临这个问题。因此,如果您可以发布一些示例代码,那么我可以解决我的问题。谢谢..
  • @KaranPatel 我已经离开了我实施元数据解决方案的公司,如果没有大量工作就无法重建这个想法。我会说,从那时起,我采用的方法是在 MVC 端为服务引用中的类型创建部分类,然后将 DataAnnotations 应用于该类型的成员。它运行良好,几乎没有重复。
  • 好的,没问题 rick.. 感谢您的快速回复。和提示.. :)

标签: jquery asp.net-mvc wcf validation


【解决方案1】:

WCF 不处理客户端验证,因为它无法知道服务另一端客户端的功能。如果你想做这样的事情,你要么需要:

  1. 在您的 WCF 服务中写入额外的函数,让您的客户能够以某种格式请求验证规则,然后使用一些自定义代码实现它们。

  2. 您的客户端需要实现自己的验证逻辑。

如果 WCF 可以按照您的意愿将验证规则传递给客户端,那将是一个杀手级功能,但它就是不能。 :(

【讨论】:

  • 我不希望使用 WCF 进行验证。您上面的#1 是对我希望找到现有方法的简单描述。 DataAnnotations 是我希望使用的功能,因为 MVC 中的默认模型绑定器会读取这些属性并自动创建 jQuery 验证控件。看起来没有内置的解决方案,所以我们将考虑编写自己的模型绑定器来为我们做这件事。感谢您的意见。
  • 我已经完成了第一次通过,并且运行顺利。简而言之,客户端可以调用 WCF 服务上的方法,该方法返回指定类型属性的描述以及用于验证这些属性的元数据。 MVC 应用程序中的自定义验证对象已注册以执行元数据和验证任务。明天我将整理一份完整的概要以及代码示例,并将其发布在此处以供将来参考。再次感谢。 - 瑞克
  • Rick,如果您可以发布一些示例代码来说明您是如何完成这项工作的,那就太好了。我遇到了和你一样的问题...
【解决方案2】:

前几天我为另一个问题提供的答案可能会对您有所帮助:

What is better way to validate business rules in ASP.NET MVC application with 3 layer architecture?

【讨论】:

  • 就像我回复@Robotsushi 一样,这就是我们正在尝试做的事情,但是在我们的设计中包含服务层会阻止它。不过,我确实很欣赏这些链接和信息。
【解决方案3】:

【讨论】:

  • 这正是我想做的,但不能因为属性没有与使用 WCF 的类一起序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2017-11-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
相关资源
最近更新 更多