Breeze 使用自定义EFContextProvider进行服务器端验证
在阅读并实现了它之后,我仍在试图找出执行服务器端验证的最佳方式,以及在保存之前如何应用业务规则……也就是说,我的问题围绕着两个应该被覆盖的方法:Breeze 使用自定义EFContextProvider进行服务器端验证,breeze,Breeze,在阅读并实现了它之后,我仍在试图找出执行服务器端验证的最佳方式,以及在保存之前如何应用业务规则……也就是说,我的问题围绕着两个应该被覆盖的方法: protectedoverride bool BeforeSaveEntity(EntityInfo EntityInfo){/} 受保护的覆盖字典BeforeSaveEntities(字典保存映射){/} 我知道文档指定“在调用BeforeSaveEntities方法之前,将为每个实体调用BeforeSaveEntities方法”一次。此外,我的
protectedoverride bool BeforeSaveEntity(EntityInfo EntityInfo){/}
受保护的覆盖字典BeforeSaveEntities(字典保存映射){/}
public class NorthwindIBModelController : ApiController {
[HttpPost]
public SaveResult MyCustomSave(JObject saveBundle) {
ContextProvider.BeforeSaveEntitiesDelegate = MyCustomBeforeSaveEntities;
return ContextProvider.SaveChanges(saveBundle);
}
private Dictionary<Type, List<EntityInfo>> MyCustomBeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) {
// your code...
}
}
公共类NorthwindIBModelController:ApicController{
[HttpPost]
public SaveResult MyCustomSave(JObject saveBundle){
ContextProvider.BeforeSaveEntitiesDelegate=MyCustomBeforeSaveEntities;
返回ContextProvider.SaveChanges(saveBundle);
}
专用词典MyCustomBeforeSaveEntities(词典保存映射){
//你的代码。。。
}
}
在保存过程中,Breeze将使用.NET验证属性执行任何已注册的验证。下面是在实体级别和属性级别应用验证属性的示例。这两个验证都将在保存任何客户对象期间执行,任何验证错误都将在SaveChanges“fail”中返回。答应我。但是现在,您需要通过检查错误结果将结果错误附加到正确的实体/属性
[AttributeUsage(AttributeTargets.Class)] // NEW
public class CustomerValidator : ValidationAttribute {
public override Boolean IsValid(Object value) {
var cust = value as Customer;
if (cust != null && cust.CompanyName.ToLower() == "xxx") {
ErrorMessage = "This customer is not valid!";
return false;
}
return true;
}
}
[AttributeUsage(AttributeTargets.Property)]
public class ContactNameValidator : ValidationAttribute {
public override Boolean IsValid(Object value) {
try {
var val = (string)value;
if (!string.IsNullOrEmpty(val) && val.StartsWith("xxx")) {
ErrorMessage = "{0} should not start with 'xxx'"";
return false;
}
return true;
} catch (Exception e) {
var x = e;
return false;
}
}
}
[MetadataType(typeof(CustomerMetaData))]
[CustomerValidator]
public partial class Customer {
[ContactNameValidator]
public string ContactName {
get;
set;
}
}
再次抛出一个错误似乎是被动的,没有办法在服务器上主动验证并返回验证错误吗?在模型实体上实现IValidatableObject怎么样?Breeze会“接受”验证吗?关于保存选项。标记似乎是传递上下文的一种很好的方式,我会尝试一下。我刚刚添加了一种额外的方法作为单独的答案。谢谢-关于
IValidatableObject
?我们是否可以使用公共类Customer:IValidatableObject
——下面是一个示例
public class NorthwindIBModelController : ApiController {
[HttpPost]
public SaveResult MyCustomSave(JObject saveBundle) {
ContextProvider.BeforeSaveEntitiesDelegate = MyCustomBeforeSaveEntities;
return ContextProvider.SaveChanges(saveBundle);
}
private Dictionary<Type, List<EntityInfo>> MyCustomBeforeSaveEntities(Dictionary<Type, List<EntityInfo>> saveMap) {
// your code...
}
}
[AttributeUsage(AttributeTargets.Class)] // NEW
public class CustomerValidator : ValidationAttribute {
public override Boolean IsValid(Object value) {
var cust = value as Customer;
if (cust != null && cust.CompanyName.ToLower() == "xxx") {
ErrorMessage = "This customer is not valid!";
return false;
}
return true;
}
}
[AttributeUsage(AttributeTargets.Property)]
public class ContactNameValidator : ValidationAttribute {
public override Boolean IsValid(Object value) {
try {
var val = (string)value;
if (!string.IsNullOrEmpty(val) && val.StartsWith("xxx")) {
ErrorMessage = "{0} should not start with 'xxx'"";
return false;
}
return true;
} catch (Exception e) {
var x = e;
return false;
}
}
}
[MetadataType(typeof(CustomerMetaData))]
[CustomerValidator]
public partial class Customer {
[ContactNameValidator]
public string ContactName {
get;
set;
}
}