2013-05-05 105 views
0

我使用Durandal/Breeze/Knockout开发项目。现在,我需要用正则表达式来验证我的视图上的输入字段。Breeze无法识别的正则表达式服务器端

我第一次尝试是在我的实体框架模型,这样插入数据注释服务器端:

public class Transport 
{ 
    [Key] 
    public int Id { get; set; } 
    [Required, RegularExpression(@"^\d{2}\.\d{3}$")] 
    public string AffairNumber { get; set; } 
    ... 

然后客户端,我为解析这些注释和插入验证这样的功能:

var addValidationRules = function(entity) { 

    var entityType = entity.entityType; 

    if (entityType) { 
     for (var i = 0; i < entityType.dataProperties.length; i++) { 
      var property = entityType.dataProperties[i]; 
      var propertyName = property.name; 
      var propertyObject = entity[propertyName]; 

      var validators = []; 
      for (var u = 0; u < property.validators.length; u++) { 
       var validator = property.validators[u]; 
       var nValidator = { 
        propertyName: propertyName, 
        validator: function (val, other) { 
         var error = this.innerValidator.validate(val, { displayName: this.propertyName }); 
         this.message = error ? error.errorMessage : ""; 
         return error === null; 
        }, 
        message: "", 
        innerValidator: validator 
       }; 
       validators.push(nValidator); 
      } 
      propertyObject.extend({ 
       validation: validators 
      }); 
     } 

     for (var i = 0; i < entityType.foreignKeyProperties.length; i++) { 
      var property = entityType.foreignKeyProperties[i]; 
      var propertyName = property.name; 
      var propertyObject = entity[propertyName]; 

      var validators = []; 
      for (var u = 0; u < property.validators.length; u++) { 
       var validator = property.validators[u]; 
       var nValidator = { 
        propertyName: propertyName, 
        validator: function (val, other) { 
         var error = this.innerValidator.validate(val, { displayName: this.propertyName }); 
         this.message = error ? error.errorMessage : ""; 
         return error === null; 
        }, 
        message: "", 
        innerValidator: validator 
       }; 
       validators.push(nValidator); 
      } 
      propertyObject.extend({ 
       validation: validators 
      }); 
      if (!property.isNullable) { 
       //Bussiness Rule: 0 is not allowed for required foreign keys 
       propertyObject.extend({ notEqual: 0 }); 
      } 
     } 
    } 
    log('Validation rules added', entity, false); 
}; 

这个函数被调用每一个实体,我想验证这样的:

function transportInitializer(transport) { 
    addValidationRules(transport); 
}; 

此解决方案仅适用于Required之类的基本验证,但对于正则表达式验证则不起作用。

我实际的解决办法是“扩展”我的观察特性affairNumber有这样一个规律:

transport.affairNumber.extend({ 
    pattern: { 
     message: 'The affair number must be correctly formatted', 
     params: '^\\d{2}\\.\\d{3}$' 
    } 
}); 

所以当不正确的值在我输入时输入的验证失败。我对此解决方案非常满意,因为我更喜欢在我的实体框架模型(服务器端)上设置验证,而不是在客户端重复验证。

我的问题:Breeze是否允许我验证我的正则表达式检索的服务器端?我忽略了另一个选项吗?

谢谢。

回答

0

Breeze现在不会向客户端传播[RegularExpression]数据注释验证。这是一个疏忽。我以前在内部注意到它。时间给它你的声音voting for it on User Voice