【问题标题】:ASP.NET MVC Where to put custom validation attributesASP.NET MVC 在哪里放置自定义验证属性
【发布时间】:2023-03-26 06:55:01
【问题描述】:

我一直在摆弄一些 ASP.NET MVC3 解决方案结构,并确定了由以下项目组成的设计:

MyApp.Web -  MVC3 Web Layer
MyApp.Data - Repositories and infrastructure for managing data
MyApp.Domain - POCO Entities
MyApp.Service - Service layer through with I manipulate the model
MyApp.Test - doh

您会将自定义验证属性类放在哪里?就我而言,它们应该进入域项目,因为它们特定于存在于那里的实体类,但是我需要引用一些 dll,例如 System.Web.MVC,我本来希望将该项目中的引用保持在最低限度。想法?

更新:

我从我的域项目中删除了所有属性并创建了视图模型以将它们包装在 Web 项目中。 将我所有的自定义验证类放在 web 项目的一个文件夹中。谢谢大家

【问题讨论】:

    标签: validation asp.net-mvc-3


    【解决方案1】:

    我会在 Web 项目上创建这些属性并将它们附加到视图模型而不是实体。

    【讨论】:

      【解决方案2】:

      您不需要引用网络 dll。仅限System.ComponentModel.DataAnnotations

      将验证属性放在它们被使用的地方。d

      更新

      为什么不呢?我见过的几乎每个示例都在视图中使用 POCO。有什么选择?为我的 POCO 创建某种包装类?

      因为:

      安全

      假设您有一个带有 IsAdmin 字段的用户 POCO。通过使用 POCO,MVC 中的 ModelBinder 将设置该属性,如果它是由因此获得管理员访问权限的“黑客”发布的。

      隔离

      在您的视图中使用 POCO 会使您的视图间接依赖于您的数据库。当然,POCO 应该消除这种依赖。但实际上他们很少这样做。

      自定义

      您很少在视图中显示所有值,因为它们存储在数据库中。

      适配模型的代码不应该在视图中,而应该在视图模型中。在您的视图中使用尽可能少的逻辑。

      【讨论】:

      • 您需要它进行客户端验证,即实现 IClientValidatable
      • 您的 POCO 不应在您的视图中使用。
      • 为什么不呢?我见过的几乎每个示例都在视图中使用 POCO。有什么选择?为我的 POCO 创建某种包装类?
      • @woggles,那么这些都是你见过的不好的例子 :-)
      • 因为安全、隔离和定制。 a) 假设您有一个带有 IsAdmin 字段的 User POCO。通过使用 POCO,MVC 中的 ModelBinder 将设置该属性,如果它是由“黑客”发布的。 b) 在您的视图中使用 POCO 会使您的视图间接依赖于您的数据库。 c)您的 ViewModel 应该包含适应它的逻辑,而不是您的视图(从视图中删除所有代码并将其添加到视图模型中)。
      【解决方案3】:

      我会在您的 Web 项目中拥有 DataAnnotation 属性,最好是在 Common.Attributes 文件夹中。我认为 jgauffin 得到的(我同意)是您的 CustomAttributes 应该真正装饰您的域项目中的 ViewModels 与实体。

      【讨论】:

        【解决方案4】:

        我会遵循您将属性添加到域对象的初衷

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-09
          • 1970-01-01
          • 2015-07-25
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多