在另一个上更改编辑模式时,验证器绑定到一个数据源

时间:2012-03-02 17:40:16

标签: xpages

我有一系列文件的重复控制,并且在同一个面板下面,但在重复控制之外,我有另一个新的绑定文档。新文档包含空白字段,但字段具有验证,在提交新文档时需要内容。

有效。

我在重复控件的重复输入面板上添加了一个“编辑”按钮。操作是弹出该入口编辑模式。

可行 - 我可以确认重复上的各行可以独立地在编辑模式之间切换,并且当切换时,下面的新文档不会切换。它不管是什么。

然而,

如果我在新文档上有验证码,它会在新文档上触发(验证失败),即使我正在切换重复中的其他绑定文档之一。

我试图确保按钮设置为部分刷新,并且仅设置为刷新重复内的单个输入面板,并且我已尝试确保按钮仅绑定到正确的文档。< / p>

它似乎只是有争议的验证代码,因为如果我禁用它,所有切换工作正常,新文档区域不会在其目标数据库中创建一个空的新文档。

显然我错过了一些东西。有什么想法吗?

如果你想要代码,我发布了一个剥离,清理和注释的版本,尽管我没有删除相关位,但我可以做到这一点:

<xp:repeat repeatControls="false" var="devices" id="ExistingDevicesList" rendered="true">
  <xp:this.value><![CDATA[#{javascript: /* Some script that populates the repeat */ }]]>
  </xp:this.value>


  <xp:panel id="IndividualDevice">    <!-- ************ start of the individual device panel -->
    <xp:this.data>
      <xp:dominoDocument var="devDocument"
        databaseName=" xxxxx.nsf" action="openDocument"
        formName="device"
        documentId="#{javascript:devices.getDocument().getUniversalID();}"
        ignoreRequestParams="true" />
    </xp:this.data>


<!-- ******************* The Edit Button ****************** -->

          <xp:button value="Edit" id="button1">
            <xp:this.binding><![CDATA[#{javascript:
    var IndividualDevice:com.ibm.xsp.component.UIPanelEx = getComponent("IndividualDevice");
    IndividualDevice}]]>
            </xp:this.binding>

            <xp:eventHandler event="onclick"
              submit="true" refreshMode="partial"
              refreshId="IndividualDevice">
              <xp:this.action>
                <xp:changeDocumentMode mode="edit" var="devDocument"> 
                </xp:changeDocumentMode>
              </xp:this.action>
            </xp:eventHandler>
          </xp:button>             

<!-- ******************************************************* -->

          <xp:inputText id="inputText4" value="#{devDocument.field1}" />       
          <xp:inputText id="inputText5" value="#{devDocument.field2}" />
  </xp:panel>      
</xp:repeat>

<!--  ********** below is a field and button bound to the NewDevice Document -->

<xp:inputText id="inputText3" value="#{NewDevice.field1}"
  style="width:371.0px" required="false">
  <xp:this.validators>
    <xp:validateRequired
      message="You must enter a value." />
  </xp:this.validators>
</xp:inputText>    
<xp:button value="submit new device" id="newDevButton">
  <xp:eventHandler event="onclick" submit="true"
    refreshMode="partial" immediate="false" save="true"
    refreshId="NewDevicePanel" />
</xp:button>    
<!-- ************************************************************************ -->

3 个答案:

答案 0 :(得分:13)

尝试将以下设置添加到“修改”按钮:

execMode =&#34;部分&#34; execId =&#34; IndividualDevice&#34;

这将确保部分刷新仅在IndividualDevice面板上运行,因此不会运行NewDevice数据源上的验证。这对于性能也会更好,因为它减少了部分刷新处理的组件树(XPage的服务器端映射)中的元素。

我能够使用代码重现您的问题,但是当我添加上述属性时,我能够成功地在重复中切换文档。

答案 1 :(得分:1)

尝试将用于保存Doc1的按钮设置为psrtial更新到覆盖Doc1字段的面板。 根据我的经验,验证器仅针对正在更新的面板中的字段进行激活。

此外,您可以随时启用和禁用任何验证器。因此,对于每个验证器,只有在例如requestScope.doc1IsSaved为true时才能启用它们。在保存操作中,在保存之前将requestScope.doc1IsSaved设置为true或false。

答案 2 :(得分:0)

另一个选择是遵循JSF(最后xPages只是JSF之上的东西)验证表单字段的方式。请参阅下面的代码示例。对于validator参数,您可以使用服务器端JS或表达式语言。虽然在支持bean中使用验证方法可能更好(参见:http://www.ibm.com/developerworks/java/library/j-jsf3/

<xp:inputText value="#{document1.txtServerName}"
    id="txtServerName1"
    required="true"
    validator="#{ServerBean.validateServerName}">
</xp:inputText>

UPD:下面是我在我的示例中使用的托管bean的代码:

package test;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

public class ServerBean {

    public ServerBean() {

    }

    public void validateServerName(FacesContext context, UIComponent toValidate,
            Object value) {
        String serverName = (String) value;

        if (serverName.indexOf('@') == -1) {
            ((UIInput) toValidate).setValid(false);

            FacesMessage message = new FacesMessage("Invalid Server Name");
            context.addMessage(toValidate.getClientId(context), message);
        }

    }

}