Validation 服务器端验证

Validation 服务器端验证,validation,dbcontext,breeze,Validation,Dbcontext,Breeze,我无法确定如何将服务器端DbContext验证错误返回到客户端。我知道Breeze有默认的验证器,可以对一些属性做出反应,比如Required,但是其他属性呢?我可以为Breeze编写一个自定义JavaScript验证器,在客户端进行检查,但我还需要检查以确保该实体在服务器端有效 例如,应用程序要求人员拥有有效的电子邮件地址。恶意用户出现并通过客户端获取电子邮件地址,并将无法通过EmailAddress验证程序的数据发布到服务器。到目前为止,我对Breeze的经验是,电子邮件地址将保存,不会出现

我无法确定如何将服务器端
DbContext
验证错误返回到客户端。我知道Breeze有默认的验证器,可以对一些属性做出反应,比如
Required
,但是其他属性呢?我可以为Breeze编写一个自定义JavaScript验证器,在客户端进行检查,但我还需要检查以确保该实体在服务器端有效

例如,应用程序要求
人员
拥有有效的电子邮件地址。恶意用户出现并通过客户端获取电子邮件地址,并将无法通过
EmailAddress
验证程序的数据发布到服务器。到目前为止,我对Breeze的经验是,电子邮件地址将保存,不会出现任何
DbContext
实体框架错误

假设下面的模型,获得任何实体验证错误的最佳方法是什么

public class PeopleContext : DbContext
{
    public PeopleContext()
        : base("name=ConnectionString"){ }

    public DbSet<Person> People { get; set; }
}

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [EmailAddress]
    [Required]
    public string Email { get; set; }
}
  • 用新的自定义验证器装饰
    说明
    字段:

    [CustomValidator]
    public string Description { get; set; }
    
  • 当然,使用s(
    System
    System.ComponentModel.DataAnnotations
    )添加适当的

  • 运行项目
  • 在其中一个描述字段中键入“错误”并保存
    这就是我希望看到Breeze出现错误的地方,甚至从实体框架抛出
    DbEntityValidationException
    。我在两台不同的电脑上试过,结果都是一样的。实体将保存到数据库,就像没有错误一样。事实上,如果您在自定义验证器的
    IsValid
    方法中的任何位置放置断点,您将看到它甚至没有被调用。

    我不确定您的意思

    将服务器端DbContext验证错误返回到客户端

    您可能希望将验证错误消息发送到客户端。但问题的其余部分表明,您想知道(a)如何在服务器上运行自定义验证,以及(b)如何在客户端获取并运行该验证的相应JavaScript版本。我将阐述对你问题的这种解释

    服务器

    实体框架(您在示例中使用的)会自动为您运行数据注释验证规则。。。除非您已手动禁用该功能。如果您以正确的方式创建自定义验证规则,EF也将运行这些规则。描述如何编写此类规则。我不能保证那篇文章的每一个细节,但在我看来它是正确的。它甚至定义了一个自定义的电子邮件验证属性

    如果编写自定义数据批注验证规则对您来说太过怪异(我经常这样做),您可以在“”中讨论的
    BeforeSave…
    方法之一中编写并调用自己的验证逻辑

    我认为这些是您最好的服务器选项。关于客户

    客户端

    Breeze注册客户端JavaScript验证,以匹配特定的服务器端数据注释(例如,
    Required
    MaxLength
    ),这些注释在元数据中是跨线的。在我写的时候,自定义数据注释既不被识别,也不包含在元数据中,而且它们在客户端上没有现成的类似物。如果您希望客户端使用这些规则预筛选您的实体,那么您必须编写自己相应的JavaScript验证器,并按照文档页面中讨论的相关实体类型注册它们


    如果您有建议或更好的选择,我们很乐意听取。

    从Breeze v 0.78.1开始,所有已注册的DbContext服务器端验证现在将在EntityManager SaveChanges调用期间执行。遇到的任何异常都将导致保存回滚,并且任何验证错误都将序列化回Breeze客户端

    请注意,基于ObjectContext(与DbContext相反)的旧EF模型尚不支持此功能


    而且。。。感谢adamlj发现这个问题并提出解决方案

    你好,沃德,谢谢你的回复,这是一个很棒的项目!我编辑了我的问题,以提供一个如何复制我所经历的问题的示例。我遇到的问题是,在使用EFContextProvider.SaveChanges(saveBundle)方法时,没有对任何数据注释进行计算。我确实下载了Breeze的源代码,如果我更改了EFContextProvider.SaveChangesCore方法的代码,请使用((DbContext)(object)Context.SaveChanges()而不是ObjectContext.SaveChanges(),那么注释的计算结果是正确的。但是我不想修改源代码。还有一点,我确实检查了BeforeSave方法。我担心的是,我只能退一本书。对于验证错误,应该有某种方法将错误消息返回给用户。您应该抛出一个包含失败解释的异常,例如,
    抛出新的InvalidOperationException(“无法保存未知类型的实体”)
    返回false仅仅告诉ContextProvider在保存期间跳过该实体;它不会终止保存!请参阅文档中的“页面”。对于更优雅的错误信令,请考虑如何将错误信息发送到Web API客户端并备份一点,我了解使用dBasic的要点。我会注意这件事的。敬请期待。
    [CustomValidator]
    public string Description { get; set; }