我用Durandal/Breeze/Knockout开发了一个项目。现在,我需要用正则表达式验证视图中的输入字段。
我的第一次尝试是在我的实体框架模型上插入一个数据注释服务器端,像这样:
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今天没有将[regulareexpression]数据注释验证传播到客户端。这是一个疏忽。我之前在内部也注意过。是时候通过在用户声音