我对数据库中存在的值进行字段验证存在疑问。

我一直遵循http://jumpstart.doublenegative.com.au/jumpstart/examples/input/contributingvalidators作为指导,对于大多数部分来说,它非常简单。但是,我碰到了一堵墙。

我正在尝试制作自己的验证器:

public class UniqueValueProperty extends AbstractValidator<String, String> {
    // my validation stuff here
}


这就是我要贡献的方式:

public void contributeFieldValidatorSource(MappedConfiguration<String, Validator> configuration) {
    configuration.add(UniqueValueProperty.VALIDATION_NAME, new UniqueValueProperty());
}


因此,总结一下:


我了解我需要提供用于客户端验证的JavaScript代码,但是我不确定如何实际访问DAO并进行检查?


编辑:

验证程序有一个您重写的方法,该方法将执行此操作:


组件使用的挂钩,以允许验证者做出贡献
其他属性或(通常)客户端JavaScript


@Override
public void render(Field field, String constraintValue,
    MessageFormatter formatter, MarkupWriter writer, FormSupport formSupport) {

    formSupport.addValidation(field, VALIDATION_NAME, buildMessage(formatter, field, constraintValue), null);


如果我正确理解,可以添加一些JavaScript代码进行客户端验证,对吗?好吧,我想在那部分做的(如果可能的话,请回答dunno)是实际使用DAO检查数据库中的某些内容,甚至将更多(动态)参数传递给验证器,例如值列表它不应触发验证失败。

感谢:D

编辑:
兰斯,您是否建议我可以这样做:

Tapestry.Validator.uniqueValueProperty = function(field, message, constraint) {

    field.addValidator(function(value) {
        if ((value != null) && (value.trim().length > 0)) {
            if (dao.valueExistsInColumn(value, constraint)) {
                throw message;
            }
        }
    });

};


通过dao方法在我的验证器对象中注入了addInstance变量?

最佳答案

使用configuration.addInstance(name, class)代替configuration.add(name, instance)。然后,挂毯将实例化您的验证器并注入任何依赖项(例如DAO)。

编辑

例如:

public class MyValidator extends AbstractValidator {
    @Inject private Dao dao;

    public void render(Field field, String constraintValue, MessageFormatter formatter, MarkupWriter writer, FormSupport formSupport) {
        // this is the serverside representation of the field which will be rendered to HTML
        Element fieldElement = writer.getElement();
        List<String> values= dao.getSomeList(constraintValue);
        String valuesAsString = values.toString();

        // add an attribute to the DOM, this can be referenced in javascript later
        fieldElement.attribute("data-values", valuesAsString);
        formSupport.addValidation(...);
    }
}


现在,该字段将在HTML / DOM中具有一个“数据列表”,您的JavaScript验证程序现在可以访问该列表。如果使用jquery,则has built in support表示“数据-”属性。例如:

var valuesAsString = $(#someField").data("values");


要么

var valuesAsString = $(#someField").attr("data-values");

10-07 16:17
查看更多