【问题标题】:Feedback panel added but does not show all messages添加了反馈面板,但未显示所有消息
【发布时间】:2011-11-07 04:01:55
【问题描述】:

当您输入电子邮件、旧密码、新密码并重复新密码以修改您的个人资料时,我有一些基本表格。我想要实现的是在通过错误时显示反馈消息。一段代码如下所示:

public class EditProfileForm extends Form<Void>
{
private static final long serialVersionUID = 1L;

// El-cheapo model for form
private final ValueMap properties = new ValueMap();

private ModalWindow modalWindow;

@SpringBean
UserManager userManager;

@SpringBean
Validator validator;

private User user;

private static final String EMAIL = "mp-email";
private static final String OLD_PASS = "mp-oldpass";
private static final String NEW_PASS = "mp-newpass";
private static final String NEW_PASS_REPEAT = "mp-newpassrepeat";

private static final String ERROR_WRONG_PASS = "Wrong pass";
private static final String ERROR_PASS_DIFF = "Pass diff";
private static final String ERROR_EMAIL_INVALID = "Wrong email";
private static final String ERROR_EMAIL_EXISTS = "Email used";

public EditProfileForm( String id, final ModalWindow modalWindow,final User u )
{
    super( id );
    this.user = u;
    this.modalWindow = modalWindow;

    add( new TextField<String>( EMAIL, new PropertyModel<String>( properties, EMAIL ) ).setRequired(true).setOutputMarkupId(true) );
    add( new PasswordTextField( OLD_PASS, new PropertyModel<String>( properties, OLD_PASS ) ).setOutputMarkupId(true) );
    add( new PasswordTextField( NEW_PASS, new PropertyModel<String>( properties, NEW_PASS ) ).setOutputMarkupId(true) );
    add( new PasswordTextField( NEW_PASS_REPEAT, new PropertyModel<String>( properties, NEW_PASS_REPEAT ) ).setOutputMarkupId(true) );

    final FeedbackPanel feedbackPanel = new FeedbackPanel( "feedback" );
    feedbackPanel.setOutputMarkupId( true );
    //feedbackPanel.setMaxMessages( 5 );

    add( feedbackPanel );

    AjaxSubmitLink closeBtn = new AjaxCloseCancelBtn( "close-x", this );
    AjaxSubmitLink cancelBtn = new AjaxCloseCancelBtn( "cancel", this );

    add( new AjaxSubmitLink( "save", this )
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit( AjaxRequestTarget target, Form<?> form )
        {
            if ( !user.getCryptedPassword().equals( CypherUtil.encodeMd5( getOldPassword() ) ) )
            {
                error( ERROR_WRONG_PASS );
            }
            else if ( !getNewPassword().equals( getNewPasswordRepeat() ) )
            {
                error( ERROR_PASS_DIFF );
            }
            else if ( !validator.validateEmailFormat( getEmail() ) )
            {
                error( ERROR_EMAIL_INVALID );
            }
            else if ( validator.emailExists( getEmail() ) )
            {
                error( ERROR_EMAIL_EXISTS );
            } else 
            {
                //save user data
            }
        }

        @Override
        protected void onError( AjaxRequestTarget target, Form<?> form )
        {
            target.add( feedbackPanel );
        }
    } );

    add( closeBtn );
    add( cancelBtn );
}

/**
 * @return
 */
private String getEmail()
{
    return properties.getString( EMAIL );
}

/**
 * @return
 */
private String getOldPassword()
{
    return properties.getString( OLD_PASS );
}

/**
 * @return
 */
private String getNewPassword()
{
    return properties.getString( NEW_PASS );
}

/**
 * @return
 */
private String getNewPasswordRepeat()
{
    return properties.getString( NEW_PASS_REPEAT );
}

}

现在,当我将这些表单留空时,我会收到很好的反馈消息,表明有字段是必需的。同时,当我输入错误的通行证、电子邮件或其他任何内容时,我一无所获,并且我的服务器日志留下这样的消息:

WARNING: Component-targetted feedback message was left unrendered. 
This could be because you are missing a FeedbackPanel on the page.  
Message: [FeedbackMessage message = "Wrong pass", reporter = save, level = ERROR]

表单位于弹出式网页中:

public class ProfilePopup extends WebPage
{
private static final long serialVersionUID = 2929269801026361184L;

public ProfilePopup(final ModalWindow modal, final User user) 
{
    add( new EditProfileForm("profileModifyForm", modal, user).setOutputMarkupId(true) );
}
}

和 HTML,将反馈放在表单之外也无济于事:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body class="stats-popup-body">
<div class="stats-popup" id="car-info-edit-popup">
    <p class="popup_title"> Edytuj Profilu </p>
    <form wicket:id="profileModifyForm" class="stats-popup-form">           
        <div>
            <label class="popup_field_label">Email:</label>
            <input type="text" wicket:id="mp-email" />
        </div>
        <div class="clear9"></div>
        <div>
            <label class="popup_field_label">Stare hasło:</label> 
            <input type="password" name="E-mail" title="E-mail1" id="E-mail2" wicket:id="mp-oldpass" />
        </div>
        <div>
            <label class="popup_field_label">Nowe hasło:</label>
            <input type="password" wicket:id="mp-newpass" />
        </div>
        <div>
            <label class="popup_field_label">Powtórz nowe hasło:</label>
            <input type="password" wicket:id="mp-newpassrepeat" />
        </div>
        <span wicket:id="feedback"></span>
        <div class="button-box-bottom">
            <input class="btn btn_save" style="margin-right: 9px;"
                wicket:id="save" type="button" value="Zapisz"
                onmousemove="this.className='btn btn_save btn_hover'"
                onmouseout="this.className='btn btn_save'" /> 
            <input
                class="btn btn_cancel" wicket:id="cancel"
                value="Anuluj" type="button" 
                onmousemove="this.className='btn btn_cancel btn_hover'"
                onmouseout="this.className='btn btn_cancel'" />
        </div>
        <div class="stats-popup-close-x" wicket:id="close-x"></div>
    </form>
</div>
</body>
</html>

【问题讨论】:

    标签: wicket


    【解决方案1】:

    onSubmit 中执行输入验证是一种不好的做法,因为一旦到达那里,(无效的)输入就会到达模型。如您所见,onSubmit 在验证阶段结束后被调用,因此输入将被视为有效,因此不会调用Form.onError

    如果您需要执行不那么简单的验证或涉及两个或多个组件输入的验证,请改用FormValidator(在构造函数中将IFormValidator 添加到Form)。请记住,用户输入不会到达FormValidator.validate() 中的组件模型,因此您需要使用Component.getConvertedInput() 来验证输入。

    如果您的验证仅涉及一个组件,并且仅对其输入进行操作,则可能建议使用 IValidator 代替。

    另外,请注意,Wicket 提供的验证器可以执行您希望执行的一些验证:EqualPasswordInputValidatorEmailAddressValidator 可能对您有用。

    例如:

    emailField.add(EmailAddressValidator.getInstance());
    form.add(new EqualPasswordInputValidator(passwordField, passwordRepeatField));
    

    查看这个(有些过时的)wiki 页面,了解有关 FormValidators 的信息:Validating related fields

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2018-10-07
      • 2021-08-08
      相关资源
      最近更新 更多