代码之家  ›  专栏  ›  技术社区  ›  anthonyv

ASP.NET MVC 2验证是否需要更多地考虑模式和使用?

  •  16
  • anthonyv  · 技术社区  · 15 年前

    这是土地的原貌。像大多数人一样,我有我的域对象和视图模型。我喜欢使用视图模型的想法,因为它允许专门为给定的视图上下文创建模型,而无需更改我的业务对象。

    我遇到的问题是在我的域对象上定义了类型级验证,并将这些规则传递给客户机。在这种情况下,假设我正在使用数据注释来描述验证规则,当我将数据从域对象移动到视图模型时,视图模型不再知道应该让接口执行什么验证(因为验证是在域对象上定义的)。

    使用MVC 2,您可以让它根据当前对象的验证规则自动执行客户端/服务器端验证。但是由于验证规则是在域对象而不是视图模型上定义的,所以我必须在视图模型上复制验证规则才能使其正常工作。

    其他人如何处理这类问题?我的想法是,除了将数据从域对象映射到视图模型之外,我们还需要跨验证规则进行映射,但我还没有真正看到其他人在讨论这个问题……BradWilson最近已经详细讨论了这个问题,但是还没有真正解决域对象和视图模型上规则的复制问题…你有什么想法?

    干杯 安东尼

    5 回复  |  直到 15 年前
        1
  •  3
  •   Brad Wilson    15 年前

    dataAnnotation属性是关于验证输入并向最终用户提供UI反馈的。这是他们唯一的预期用途。我对UI对象和业务对象使用不同的验证策略,因此DA验证属性最终只会出现在向用户显示的模型上。

        2
  •  2
  •   Adrian Anttila    15 年前

    这可能不合适,但如果您刚将验证规则/注释从模型移动到视图模型,会怎么样?在我参与过的一些项目中,我们选择阻止视图访问通过其相应的视图模型公开的信息以外的任何内容。由于所有数据交互都将通过ViewModel执行,因此不需要对模型对象进行验证。

    此参数的反作用是您可以轻松地复制某些验证规则,因为不同的视图模型可能与相同的模型交互。在这种情况下,简单地将模型声明为ViewModel上公开的属性可能是有意义的。对于回发,他们可以接受模型作为参数,从而允许ModelBinder基础结构处理请求。在这种情况下,如果modelstate.isvalid为false,则可以在重新显示视图之前将该属性重新分配给视图模型。

    我建议将注释移动到视图模型中。这是有意义的,因为许多视图是a)多个模型组合的结果,或b)模型数据的子集。

        3
  •  2
  •   Martin Suchanek    15 年前

    事实证明,automapper可以自动地为我们做这件事,这是最好的情况。

    automapper用户:是否将验证属性传输到视图模型?
    http://groups.google.com/group/automapper-users/browse_thread/thread/efa1d551e498311c/db4e7f6c93a77302?lnk=gst&q=validation#db4e7f6c93a77302

    我还没来得及在那里尝试那些建议的解决方案,但我打算很快。

    (克罗斯也把这个贴在了我的(重复)问题上)。

        4
  •  0
  •   Gopher    15 年前

    也许我们根本不应该使用视图模型? 定义模型层实体的验证规则。

        5
  •  0
  •   ventaur    15 年前

    我也考虑了一段时间了。我完全理解布拉德的回答。但是,假设我想使用另一个验证框架,该框架适用于同时注释域实体和视图模型。

    我能在纸上找到的唯一一个仍然可以使用属性的解决方案是创建另一个属性,该属性“指向”正在视图模型中镜像的域实体的属性。下面是一个例子:

    // In UI as a view model.
    public class UserRegistration {
      [ValidationDependency<Person>(x => x.FirstName)]
      public string FirstName { get; set; }
    
      [ValidationDependency<Person>(x => x.LastName)]
      public string LastName { get; set; }
    
      [ValidationDependency<Membership>(x => x.Username)]
      public string Username { get; set; }
    
      [ValidationDependency<Membership>(x => x.Password)]
      public string Password { get; set; }
    }
    

    可以扩展XVAL这样的框架来处理这个新属性,并在依赖类的属性上运行验证属性,但使用视图模型的属性值。我只是没时间再充实一下。

    有什么想法吗?