如何使用Ajax按钮验证表单

时间:2013-07-21 13:16:39

标签: forms validation wicket onsubmit

我在表格实际上以子表格验证时遇到问题。

在我的网站上,我有一些表格和“添加行”按钮(BlockingAjaxSubmitLink)。 当我尝试添加let say 2行时,我得到验证错误(因为此表中的行具有Required = True参数)并且我无法添加另一行。我尝试使用简单的AjaxLink,但它没有在onClick方法中引用表单,当我完成一些行并单击“添加行”时,这些数据就会丢失。

我想在“点击”按钮点击后才启用验证。

知道如何处理这个问题吗?

3 个答案:

答案 0 :(得分:0)

我使用AjaxLink执行您想要的操作。 我的AjaxLink

   private AjaxLink addNewRow = new AjaxLink("addNewRow") {
      @Override
      public void onClick(AjaxRequestTarget target) {
         MyEntityObject newTableRowObject = new MyEntityObject(irrelevantParameter);
         entityObjectTableService.createNewRowInDB(newTableRowObject );
         target.add(listViewContainer);
      }
   };

在此代码中,listViewContainerWebMarkupContainer,其中包含保存表格行的ListView

当我单击此AjaxLink时,表示我表中一行的新对象被添加到数据库中,然后正在刷新包含ListView的容器,刷新ListView和新的正在从DB中获取空对象,并在最后显示为表中的新行。

答案 1 :(得分:0)

根据您的结构,您可能正在考虑使用setDefaultFormProcessing(true); - http://ci.apache.org/projects/wicket/apidocs/6.x/org/apache/wicket/markup/html/form/AbstractSubmitLink.html#setDefaultFormProcessing%28boolean%29

来停用验证

答案 2 :(得分:0)

现在我写了一些黑客

首先我设置

addKnowledgeLink.setDefaultFormProcessing(false);

和下一个

    BlockingAjaxSubmitLink<Object> addKnowledgeLink = new BlockingAjaxSubmitLink<Object>(
                "link_knowledge_add") {
    @Override
    protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
        ChangeDataForm.this.process(this);

        /*  some code   */


        target.add(form.get(MY_CONTAINER_ID));
    }
(...)

和我的黑客...

//HACK
public void process(IFormSubmitter object){
    if (!isEnabledInHierarchy() || !isVisibleInHierarchy())
    {
        return;
    }
    // run validation
    validate();
        /*if (hasError())
    {
        // mark all children as invalid
        markFormComponentsInvalid();
            // let subclass handle error
        callOnError(object);
    }
    else
    {*/
        // mark all children as valid
        markFormComponentsValid();
            // before updating, call the interception method for clients
        beforeUpdateFormComponentModels();
            // Update model using form data
        updateFormComponentModels();
            // validate model objects after input values have been bound
        onValidateModelObjects();
        if (hasError())
        {
            callOnError(object);
            return;
        }
        // Form has no error
        delegateSubmit(object);
    //}
}

我想要一种方法

@Override
    protected void onError(){
        super.onError();
        this.updateFormComponentModels();
    }

我知道这是一个丑陋的解决方案,但我无法找到更好的东西.. 我无法关闭反馈消息