簡體   English   中英

驗證失敗后重置selectOneMenu表單值

[英]Reset selectOneMenu form value after validation failure

我們正在嘗試將selectOneMenu用作業務實體的“狀態”控件。 下拉列表具有狀態列表。 當用戶選擇狀態時,我們將運行一組復雜的業務規則,這些規則確定所選狀態是否可以在業務實體上設置。 如果不是,我們會寫一條信息為什么不這樣做,並禁止設置狀態。 這一切在JSF生命周期中都可以正常運行,除了我想在驗證失敗之前將下拉菜單重置為以前的狀態(又稱當前狀態)。 因此,如果我從狀態A切換到狀態B,但失敗了,我想將表單控件重置為狀態B。

小面代碼

<p:selectOneMenu id="statusMenu"
    binding="#{mybean.statusMenu}"
    converter="myConverter"
    value="#{mybean.statusValue}">

    <f:event type="preValidate" listener="#{mybean.validateStatus}"/>
    <p:ajax update="statusMenu :someForm :someOtherForm" />

    <f:selectItems value="#{mybean.statusList}"
        var="status"
        itemLabel="#{status.statusText}"
        itemValue="#{status}">
    </f:selectItems>
</p:selectOneMenu>

支持bean驗證菜單

public void validateStatus (ComponentSystemEvent e)
{
    String submittedStatus = ((MyStatus)getStatusMenu().getValue()).getStatusText();

    if(submittedStatus.equals("someStatus"))
    {       
        //do validation
        boolean valid = doBusinessStatusValidationLogicStuff()

        if(!valid)
        {
            //a combination of junk that attempts to reset the form value, or do *something* to it
            getStatusMenu().resetValue();
            getStatusMenu().setSubmittedValue(null);
            getStatusMenu().setValue(null);
            getStatusMenu().setLocalValueSet(false);

            FacesMessage errorMessage = new FacesMessage(severity, summary, detail);
            context.addMessage(null, "you fail");
            context.isValidationFailed();
            context.renderResponse();
        }
    }
}

我可以在調試器中看到綁定組件的值設置為所需的值,但是它根本不會更新表單控件。 我想念什么?

最終成為一個equals / hashcode問題。 因此,請務必確保在那里檢查!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM