Jsf 保存时PrimeFaces对话框中的空属性

Jsf 保存时PrimeFaces对话框中的空属性,jsf,primefaces,Jsf,Primefaces,问题在于两个文本字段发送空字符串而不是键入的文本。他们在对话中。托管bean是视图范围的。此命令按钮打开对话框: <p:commandButton id="btn-open_dialog-name_query" oncomplete="PF('dialog_name_query').show();" style="width: 209px; text-align: center;" va

问题在于两个文本字段发送空字符串而不是键入的文本。他们在对话中。托管bean是视图范围的。此命令按钮打开对话框:

<p:commandButton id="btn-open_dialog-name_query" 
                 oncomplete="PF('dialog_name_query').show();"
                 style="width: 209px; text-align: center;"
                 value="Save Query" />

p:commandButton
内置了ajax功能,因此无需使用
p:ajax
。我相信您的问题在于
p:ajax
默认为
process=“@this”
(在本例中仅表示
commandButton
),因此不会提交
p:inputText
。但是
p:commandButton
默认为
process=“@form”
,这就是您需要的:

<p:commandButton id="btn-save_query-client" 
             value="Save to current client" 
             action="#{dashboardDetailedMB.saveQueryClient}" 
             update="msg" />


另外,您的表单似乎在对话框中,我发现在对话框中放置表单并将对话框放在页面主表单下方是最安全的,但如果它正常工作,则无需更改它。

谢谢!它还解决了另一个不困扰用户的问题:双重Ajax请求(可能是因为嵌套表单)。
public void saveQueryClient() {
    try {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();
        HttpSession session = (HttpSession) request.getSession(false);
        String querySql = (String) session.getAttribute("querySql");
        query.setQuery(querySql);
        queryBean.add(query);
        queryBean.insertClientHasQuery(getClientId(), queryBean.getLastRow().getId());
        jsfUtils.messages("INFO", "Query inserted!", "");
    } catch (Exception ex) {
        ex.printStackTrace(System.out);
        jsfUtils.messages("ERROR", "Error when saving query to client!", "");
    }
}
<p:commandButton id="btn-save_query-client" 
             value="Save to current client" 
             action="#{dashboardDetailedMB.saveQueryClient}" 
             update="msg" />