在禁用字段上进行挂毯验证

时间:2019-01-28 17:28:20

标签: java forms tapestry

我基本上有一个不能为空的文本字段,因此我添加了此验证:

t:validate="required"

(我实际上还有一些验证标准,但在这里与它们无关)。但是,有时也可以禁用此字段(它绑定到Java代码中的属性):

t:disabled="isFieldADisabled"

另外,该值绑定到属性:

t:value="entity.fieldA"

其设计使得在禁用该字段时该属性永远不会为空。但是,当该字段被禁用时,即使文本框中显示了某些内容,我也无法提交该表单。我不知道这里发生了什么,但是我随后尝试manually进行验证,例如:

@OnEvent(value = EventConstants.VALIDATE)
void onValidate(){
    if (isFieldADisabled)
        // What should I do here?
}

正如我的评论所指出的,我不确定在那里该做什么。另一个复杂的问题是,整个事情都放在container中,而form本身就包含在onValidate中,所以我实际上并不能从onPrepareForSubmitFromEditForm方法访问表单本身。 / p>

我怀疑这是一个普遍的问题,如果不是,请告诉我是否需要更多信息。

编辑,我已经评估了onValidateFromEditForm中文本字段的状态:

如您所见,该字段确实被禁用,其值甚至都不为空。但是,在disabled中,aArtsitNames =[ "Artist Name: \"TwnetyOnePiloits\" ","Artist Name: \"Bastile\" " ] 的tge值实际上为false,但是该字段的值仍然不为空。

1 个答案:

答案 0 :(得分:0)

如果组件位于表单中,则可以在呈现/提交表单期间使用组件可用的内置environmental services之一,即ValidationTracker。使用该服务可以手动记录表单验证错误,即ValiadationTracker#recordError(Field field, String message)

但是,默认情况下,此类组件不会收到VALIDATE事件,因为此事件是在Form组件本身上触发的,并冒泡到其容器。当您需要对多个字段实施自定义验证时,此事件用于跨表单验证。您仍然可以使用ValidationTracker来记录验证错误。

对于disabled property of AbstractField,如果其值为true,则该组件将不参与验证,客户端和服务器端均不参与验证:

  

如果为true,则该字段将使用禁用的属性呈现(以关闭客户端行为)。提交表单后,将再次评估绑定值,如果为true,则将忽略(甚至不验证)字段的值,并且不会触发组件的事件。