2013-05-05 103 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