Wicket:在向导步骤中阻止TextField提交表单

时间:2013-11-01 14:13:29

标签: java wicket wicket-1.6

问题涉及Wicket 1.6

我有一个向导步骤,其中包含一个Textfield组件。当我按下Enter键时,这将由向导栏的默认按钮(“下一步”)处理,然后进入向导中的下一步。我不希望这种情况发生。当我在文本字段上按Enter键时,我只想更新值,但保留在同一页面上。

我尝试覆盖我的Wizard类的onBeforeRender()方法,正如您所看到的那样,将包含表单的默认按钮设置为null。但是,现在这会导致在按Enter键时触发“上一个”按钮,因此向导将返回上一步。

public class ConfigurationWizard extends Wizard {

   ....

   @Override
   protected void onBeforeRender()
    {
        super.onBeforeRender();
        Component buttonBar = getForm().get(BUTTONS_ID);
        if (buttonBar instanceof IDefaultButtonProvider)
        {
            getForm().setDefaultButton(null);
        }
    }
}

所以基本的问题是,如何禁用向导的默认按钮行为?

3 个答案:

答案 0 :(得分:6)

我的方法(有很好的Wicket行为)

用法

TextField<String> myField = new TextField<String>("myField", myModel());
myField.add(new PreventSubmitOnEnterBehavior());

行为

public class PreventSubmitOnEnterBehavior extends Behavior
{
    private static final long serialVersionUID = 1496517082650792177L;

    public PreventSubmitOnEnterBehavior()
    {
    }

    @Override
    public void bind( Component component )
    {
        super.bind( component );

        component.add( AttributeModifier.replace( "onkeydown", Model.of( "if(event.keyCode == 13) {event.preventDefault();}" ) ) );
    }
}

答案 1 :(得分:2)

这与向导按钮无关。

当按下Enter键时,TextField <input>正在执行表单提交。这是<input>元素的标准行为。

解决方案是按下Enter键按下<input>并阻止默认行为 这一点javascript魔术对我有用:

   <script type="text/javascript">
   $(document).ready(function() {
             $("#gridDiv").delegate("input","keypress",function(e){
                 if(e.originalEvent.keyCode == 13){
                     e.preventDefault();
                 }
              });
          });
   </script>

其中'gridDiv'是包含TextField

<div>的id

答案 2 :(得分:0)

我更喜欢另一种方法:

我对所需的每个按钮使用AjaxButtons,并在覆盖的onSubmit()中使用特定的提交代码:

AjaxButton linkSubmit = new AjaxButton("linkSubmit")
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
super.onSubmit();
// Submit code goes here....
// ...
setResponsePage(new NewPage());
}
@Override
public void onError(AjaxRequestTarget target, Form form) {
}
};

我的表单不需要“onSubmit()”方法。

标记没有任何提交按钮。所有按钮的编码如下:

使用这种方法,您不需要乱用javascript代码。如果按Enter键,页面将无效。您必须单击按钮才能提交每个按钮。

希望这可以帮到你。