Problema com Multiplos form e ajax

Boa tarde pessoal

Tenho um cadastro com a estrutura abaixo:

bairro.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <ui:composition template="/WEB-INF/templates/interno.xhtml">
        <ui:define name="css">
            <h:outputStylesheet library="css" name="bairro.css" />
        </ui:define>
        <ui:define name="titulo">- Cadastro de Bairros</ui:define>
        <ui:define name="conteudo">
            <h:panelGroup id="cadastro">
                <h:panelGroup  rendered="#{!bairroBean.editando}">
                    <ui:include src="/WEB-INF/endereco/cadBairro.xhtml" />
                </h:panelGroup>
                <h:panelGroup  rendered="#{bairroBean.editando}">
                    <ui:include src="/WEB-INF/endereco/regBairro.xhtml" />
                </h:panelGroup>
            </h:panelGroup>
        </ui:define>
    </ui:composition>
</html>

cadBairro.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ci="http://java.sun.com/jsf/composite/components/inputs">
    <h:body>
        <h:form id="frmCadastro">
            <h:panelGroup id="pnlFiltro">
                <h:outputText value="Filtro" styleClass="tituloInterno" />
                <h:panelGrid columns="2">
                    <h:outputLabel for="cbxEstado" value="Estado:" />
                    <h:outputLabel for="txtCidade" value="Cidade:" />
                    <h:panelGroup>
                        <h:selectBooleanCheckbox id="chkIncluirEstado" value="#{bairroBean.incluirEstado}">
                            <f:ajax render="cbxEstado" onevent="controleAjax" />
                        </h:selectBooleanCheckbox>
                        <h:selectOneMenu id="cbxEstado" value="#{bairroBean.estado}" disabled="#{not bairroBean.incluirEstado}">
                            <f:selectItems var="estado" value="#{bairroBean.estados}" itemValue="#{estado}" itemLabel="#{estado.descricao}" />
                            <f:converter converterId="estadoConverter" />
                        </h:selectOneMenu>
                    </h:panelGroup>                
                    <h:panelGroup>
                        <h:selectBooleanCheckbox id="chkIncluirCidade" value="#{bairroBean.incluirCidade}">
                            <f:ajax render="frmCadastro:txtCidade:input" onevent="controleAjax" />
                        </h:selectBooleanCheckbox>
                        <ci:caixaEdicao id="txtCidade" value="#{bairroBean.cidade}" maxlength="50" size="25" readonly="#{!bairroBean.incluirCidade}" />
                    </h:panelGroup>
                </h:panelGrid>
                <h:panelGrid columns="3">
                    <h:outputLabel for="txtDescricao" value="Descrição:" />
                    <h:outputText />
                    <h:outputText />
                    <ci:caixaEdicao id="txtDescricao" value="#{bairroBean.descricao}" maxlength="50" size="25" />
                    <h:commandButton value="Pesquisar" 
                                     action="#{bairroBean.pesquisar()}">
                        <f:ajax execute="@form" render=":mensagem pnlTabela" onevent="controleAjax" />
                    </h:commandButton>
                    <h:commandButton value="Novo" 
                                     action="#{bairroBean.novo()}" immediate="true">
                        <f:ajax execute="@form" render=":mensagem :cadastro" onevent="controleAjax" />
                    </h:commandButton>
                </h:panelGrid>
            </h:panelGroup>
            <h:panelGroup id="pnlTabela">
                <ci:grid value="#{bairroBean.modelos}"
                         rendered="#{not empty bairroBean.modelos}"
                         columnClasses="colBtn,colBtn,colEstado,colCidade,colDescricao">
                    <h:column>
                        <h:commandLink id="lnkAlterar"
                                       action="#{bairroBean.alterar()}" 
                                       immediate="true"
                                       title="Alterar bairro: #{modelo.descricao}">
                            <f:setPropertyActionListener target="#{bairroBean.modelo}" value="#{modelo}" />
                            <f:ajax render=":mensagem :cadastro" onevent="controleAjax" />
                            <h:graphicImage library="img" name="editar.png" />
                        </h:commandLink>
                    </h:column>
                    <h:column>
                        <h:commandLink id="lnkExcluir" 
                                       action="#{bairroBean.excluir()}" 
                                       onclick="if (!confirm('Excluir bairro: #{modelo.descricao}?')) return false;"
                                       immediate="true" 
                                       title="Excluir bairro: #{modelo.descricao}">
                            <f:setPropertyActionListener target="#{bairroBean.modelo}" value="#{modelo}" />
                            <f:ajax render=":mensagem :cadastro" onevent="controleAjax" />
                            <h:graphicImage library="img" name="excluir.png" />
                        </h:commandLink>
                    </h:column>
                    <h:column>
                        <f:facet name="header">Estado</f:facet>
                        <h:outputText value="#{modelo.cidade.estado.descricao}" />
                    </h:column>
                    <h:column>
                        <f:facet name="header">Cidade</f:facet>
                        <h:outputText value="#{modelo.cidade.descricao}" />
                    </h:column>
                    <h:column>
                        <f:facet name="header">Descrição</f:facet>
                        <h:outputText value="#{modelo.descricao}" />
                    </h:column>
                </ci:grid>
            </h:panelGroup>
        </h:form>
    </h:body>
</html>

regBairro.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:cb="http://java.sun.com/jsf/composite/components/busca"
      xmlns:ci="http://java.sun.com/jsf/composite/components/inputs"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:body>    
        <h:form id="frmRegistro">
            <h:panelGrid id="pnlCidade" columns="2">
                <h:outputLabel for="txtEstadoReg" value="Estado (*):" />
                <ci:caixaEdicao id="txtEstadoReg" 
                                value="#{bairroBean.modelo.cidade.estado.descricao}" 
                                size="15"
                                readonlyLabel="true" />
                <h:outputLabel for="txtCidadeReg" value="Cidade (*):" />
                <ci:caixaEdicao id="txtCidadeReg" 
                                value="#{bairroBean.modelo.cidade.descricao}" 
                                size="20"
                                readonlyLabel="true" />
                <h:commandButton value="Procurar" onclick="dlgBuscaCidade.mostrar();return false;" />
            </h:panelGrid>
            <h:panelGrid>
                <h:outputLabel for="txtDescricaoReg" value="Descrição (*):" />
                <ci:maiusculo id="txtDescricaoReg" value="#{bairroBean.modelo.descricao}" 
                              size="25" maxlength="50" />
            </h:panelGrid>
            <h:panelGrid columns="2">
                <h:commandButton value="Gravar" 
                                 action="#{bairroBean.gravar()}">
                    <f:ajax execute="@form" render=":mensagem :cadastro" onevent="controleAjax" />
                </h:commandButton>
                <h:commandButton value="Cancelar" 
                                 action="#{bairroBean.cancelar()}" immediate="true">
                    <f:ajax execute="@form" render=":mensagem :cadastro" onevent="controleAjax" />
                </h:commandButton>
            </h:panelGrid>
        </h:form>
        <cb:buscaCidade id="dlgBuscaCidade" 
                        cidade="#{bairroBean.modelo.cidade}" 
                        update=":frmRegistro:pnlCidade" />
    </h:body>
</html>

Se observar os xhtmls, tem o regBairro que tem um componente chamado buscaCidade com o código abaixo:

buscaCidade.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:cu="http://java.sun.com/jsf/composite/components/util"
      xmlns:ci="http://java.sun.com/jsf/composite/components/inputs">
    <cc:interface>
        <cc:attribute name="id" />
        <cc:attribute name="update" type="java.lang.String" />
        <cc:attribute name="cidade" required="true" type="br.com.tebosoftware.modelo.endereco.Cidade" />
        <cc:valueHolder name="cidade" targets="dglBuscaCidade" />
        <cc:editableValueHolder name="cidade" targets="dglBuscaCidade" />
    </cc:interface>
    <cc:implementation>
        <h:outputStylesheet library="css" name="cidade.css" />
        <cu:painelModal id="painelModal" widget="#{cc.attrs.id}" titulo="Selecionar Cidade" 
                        width="500" height="400"
                        aoMostrar="focalizar('#{cc.clientId}:painelModal:txtDescricao:input')">
            <h:form prependId="false">
                <h:panelGrid columns="3">
                    <h:outputLabel for="cbxEstado" value="Estado:" />
                    <h:outputLabel for="txtDescricao" value="Descrição:" />
                    <h:outputText />
                    <h:panelGroup>
                        <h:selectBooleanCheckbox id="chkIncluirEstado" value="#{cidadeBean.incluirEstado}">
                            <f:ajax execute="@form" render=":mensagem cbxEstado" onevent="controleAjax" />
                        </h:selectBooleanCheckbox>
                        <h:selectOneMenu id="cbxEstado" value="#{cidadeBean.estado}" disabled="#{not cidadeBean.incluirEstado}">
                            <f:selectItems var="estado" value="#{cidadeBean.estados}" itemValue="#{estado}" itemLabel="#{estado.descricao}" />
                            <f:converter converterId="modeloConverter" />                       
                        </h:selectOneMenu>
                    </h:panelGroup>
                    <ci:caixaEdicao id="txtDescricao" value="#{cidadeBean.descricao}" maxlength="50" size="20" />
                    <h:commandButton value="Pesquisar"
                                     action="#{cidadeBean.pesquisar()}">
                        <f:ajax execute="@form" render=":mensagem pnlTabela" onevent="controleAjax" />
                    </h:commandButton>
                </h:panelGrid>
                <h:panelGroup id="pnlTabela" style="display:block; height: 330px; overflow: auto;">
                    <ci:grid id="tabela" value="#{cidadeBean.modelos}"
                             rendered="#{not empty cidadeBean.modelos}"
                             columnClasses="colBtn,colDescricao,colSigla">
                        <h:column>
                            <h:commandLink id="lnkSelecionar" 
                                           immediate="true"
                                           title="Selecionar cidade: #{modelo.descricao}">
                                <h:graphicImage library="img" name="ativo.png" />
                                <f:setPropertyActionListener target="#{cc.attrs.cidade}" value="#{modelo}" />
                                <f:ajax execute="@form" render=":mensagem #{cc.attrs.update}" onevent="#{utilBean.remover2Pontos(cc.clientId)}_aoSelecionar" />
                            </h:commandLink>
                        </h:column>
                        <h:column>
                            <f:facet name="header">Descrição</f:facet>
                            <h:outputText value="#{modelo.descricao}" />
                        </h:column>
                        <h:column>
                            <f:facet name="header">Estado</f:facet>
                            <h:outputText value="#{modelo.estado.sigla}" />
                        </h:column>
                    </ci:grid>
                </h:panelGroup>
            </h:form>
        </cu:painelModal>
        <script type="text/javascript">
            function #{utilBean.remover2Pontos(cc.clientId)}_aoSelecionar(data) {
                controleAjax(data);
                if (data.status == "complete") {
            #{cc.attrs.id}.ocultar();
                    }
                }
        </script>
    </cc:implementation>
</html>

O problema consiste em:

quando entra pela primeira vez, é exibido o cadBairro.xhtml pois o bean não estará em edição. Se eu clicar no botão pesquisar é feito a pesquisa normal, exibindo os dados no grid (o grid é outro composite componente que facilita o h:datatable).
Se clicar no botão novo ele coloca o bean em edicao e mostra o regBairro.xhtml.
O problema está aí: se eu clico no botão para buscar a cidade, exibe o meu componente de buscaCidade mas se eu clicar na pesquisa dele não funciona e seu eu tentar clicar no botão gravar também não funciona, o único que funciona é o cancelar.

Alguém pode me dar uma luz?

Uma coisa que esqueci de comentar, os meus beans estão em ViewScoped.

Conseguiu resolver este problema?

Cara é o seguinte,

Da muito problema usar form dentro de outro form.

O que eu estava tentando fazer era tirar o elemento de dentro do form pai, mas ao fazer isso o JSF se perde pois o form não está mais sendo filho do anterior.

Eu sugiro utilizar o Primefaces, pois ele coloca o dialogo fora do form pai e o anexa ao body e quando for ser feito o submit não dará a falha, pois na construção já está no lugar certo.

Espero ter ajudado.

Falow