纵观微风,我对它的许多功能印象深刻。Breeze服务器端验证
我无法弄清楚如何将服务器端DbContext验证错误返回给客户端。我知道Breeze拥有默认的验证器,可以对诸如“必需”之类的一些属性做出反应,但是其他所有属性又如何?我可以为Breeze编写一个自定义的JavaScript验证器来检查客户端,但我还需要检查以确保该实体在服务器端是有效的。
例如:该应用程序需要一个“人”来有一个有效的电子邮件地址。恶意用户会出现并获取通过客户端的电子邮件地址并发送到服务器,但日期不会通过“EmailAddress”验证器。到目前为止,我对Breeze的经验是,电子邮件地址将保存并不会冒泡任何DbContext/Entity Framework错误。
假设下面的模型,什么是获得任何实体验证错误的最佳方法?
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; }
}
更新1:
这里有一些说明来重新创建,我遇到的问题。
- 按照说明来创建“待办事项”样品(http://www.breezejs.com/documentation/start-nuget)
添加一个新的自定义验证到BreezeSampleTodoItem.cs文件
[AttributeUsage(AttributeTargets.Property)] public class CustomValidator : ValidationAttribute { public override Boolean IsValid(Object value) { string val = (string)value; if (!string.IsNullOrEmpty(val) && val == "Error") { ErrorMessage = "{0} equal the word 'Error'"; return false; } return true; } }
装饰描述字段与新的自定义验证者:
[CustomValidator] public string Description { get; set; }
添加正确使用的当然(“System”和“System.ComponentModel.DataAnnotations”)。
- 运行该项目。
- 在其中一个描述字段中输入“Error”并保存。
这是我期望通过微风看到错误,甚至从实体框架中抛出“DbEntityValidationException”的地方。我已经在2台独立的电脑上尝试了相同的结果。实体保存到数据库,就好像没有错误一样。事实上,如果你在自定义验证器的IsValid方法内的任何位置放置一个断点,你将会看到它甚至没有被调用。
嗨病房,感谢您的答复,和真棒项目!我编辑了我的问题,以提供如何复制我遇到的问题的示例。我遇到的问题是,在使用EFContextProvider.SaveChanges(saveBundle)方法时,没有任何数据注释正在被评估。我确实拉下了Breeze的源代码,如果我更改EFContextProvider.SaveChangesCore方法的代码,请使用((DbContext)(object)Context).SaveChanges()而不是ObjectContext.SaveChanges(),然后正确评估注释。但我宁愿不修改源文件。 – adamlj
还有一点需要注意,我检查过BeforeSave方法。我担心的是我只能返回一个布尔值。对于验证错误,应该有一些方法可以将错误消息发回给用户。 – adamlj
你应该抛出一个异常,包括失败的解释,例如抛出新的InvalidOperationException(“不能保存未知类型的实体”);'返回false仅仅告诉ContextProvider在保存期间跳过该实体;它不会终止保存!请参阅“[服务器端拦截](http://www.breezejs。com/documentation/server-side-interception)“页面 – Ward