【问题标题】:Xpages - SSJS validation, with CSJS onCompleteXpages - SSJS 验证,CSJS onComplete
【发布时间】:2018-10-16 09:35:58
【问题描述】:

我正在使用可重复使用的自定义控件,每个自定义控件上的字段的自定义属性之一是指定是否需要该字段,是或否。如果是,并且该字段为空白,它将显示一些帮助文本,并将颜色更改为红色。这一切都很好。但是,我的表单上有很多这些字段,因此如果一个或多个字段验证失败并且我不确定如何执行此操作,我想在屏幕顶部显示一条消息。我有一个“提交”按钮,单击它可以工作,但我无法让它运行任何 SSJS,因为这些字段没有通过验证,所以它永远不会运行代码。我在想我可以用 CSJS onComplete 做一些事情,但是我不确定如果验证在“某处”失败而不列出所有字段名称并循环遍历它们,我该如何处理。如果验证失败,最终目标是向用户显示一条消息并停止处理更多代码。如果验证通过,我会调用一个模态。我可以让所有这些位工作,但我只需要知道如何处理验证是否通过/失败并在失败时继续执行一些代码。

我想我可以使用facesContext.getMessages().hasNext() 来检查消息,但是我什至不能再调用它,因为任何“必填”字段都会阻止我的其余代码运行。

提前感谢您的任何指点

【问题讨论】:

    标签: validation xpages xpages-ssjs


    【解决方案1】:

    我已经解决了这个问题:

    计算文本,隐藏:

    <xp:text escape="true" id="cmpValidation" style="display:none">
            <xp:this.value><![CDATA[#{javascript:if(facesContext.getMessages().hasNext()){
        return "Fail";
    }else{
        return "Succes";
    }}]]></xp:this.value>
        </xp:text>
    

    然后,在我的按钮的 onComplete 中,我检查计算字段中的值,如果那里有值,则验证失败,因此我向用户显示通知。如果不是,则验证已通过,我将改为显示我的模态。

    <xp:button value="Test Submit" id="button3" styleClass="btn btn-header">
    
    
    
        <xp:eventHandler event="onclick" submit="true" refreshMode="partial"
            refreshId="contentWhiteBackground">
    
    
    
            <xp:this.onComplete><![CDATA[var val = XSP.getElementById("#{id:cmpValidation}").innerHTML;
    
    if(val =="Fail"){
        var o = {};
        o.title = "Validation Failed";
        o.body = "You must complete all questions before submitting";
        o.alertIcon = "fa-thumbs-down fa-lg";
        o.alertType = "danger";
    
        var myDiv = document.getElementById("#{id:contentWhiteBackground}");
        myDiv.scrollTop = 0;
        bootAlert.show('alertServer',JSON.stringify(o));
    
    }else{
        $('#modalConclusion').modal('show');
    }
    ]]></xp:this.onComplete>
        </xp:eventHandler>
    
    </xp:button>
    

    【讨论】:

      【解决方案2】:

      首先,我希望我能正确理解你的问题!以下代码 sn-p 专注于您的最终目标:

      如果验证失败,最终目标是向 用户并停止处理更多代码。如果验证通过,我然后 调用模态。

      自定义控件

      我的应用程序正在使用 自定义控件 来汇总所有表单错误消息:

      <?xml version="1.0" encoding="UTF-8"?>
      <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
      
          <xp:panel id="pnlFormError">
              <xp:text escape="true" id="txtErrorMsgTitle"
                  value="#{javascript:compositeData.errorMessageTitle}"
                  style="font-weight:bold;color:rgb(255,0,0)">
              </xp:text>
              <xp:messages id="valsErrorMessages" 
                  showSummary="true" disableTheme="true">
              </xp:messages>
          </xp:panel>
      
      </xp:view>
      

      XPage

      这里的 xpage 带有一些表单输入控件、模式对话框和包含的错误消息自定义控件:

      <?xml version="1.0" encoding="UTF-8"?>
      <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom" xmlns:xe="http://www.ibm.com/xsp/coreex">
      
          <xp:div id="container">
              <xc:globalFormErrorPanel errorMessageTitle="Please check the following errors:">
                  <xp:this.rendered><![CDATA[#{javascript:facesContext.getMaximumSeverity()}]]></xp:this.rendered>
              </xc:globalFormErrorPanel>
      
              <xp:br></xp:br>
              Input Control:&#160;
              <xp:inputText id="txtInput" required="true">
                  <xp:this.validators>
                      <xp:validateRequired message="You have to enter a value (with min 10 charachters)!"></xp:validateRequired>
                      <xp:validateLength minimum="10"></xp:validateLength>
                  </xp:this.validators>
              </xp:inputText>
      
              <xp:br></xp:br>
              Input Control3:&#160;
              <xp:inputText id="txtInput2" required="true">
                  <xp:this.validators>
                      <xp:validateRequired message="You have to enter a value (with min 5 charachters)!"></xp:validateRequired>
                      <xp:validateLength minimum="5"></xp:validateLength>
                  </xp:this.validators>
              </xp:inputText>
      
              <xp:br></xp:br>
              <xp:br></xp:br>
              <xp:button id="btnSubmit" value="Submit">
                  <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="container" execMode="partial"
                      execId="container">
                      <xp:this.action><![CDATA[#{javascript:getComponent("dlgModal").show();
      print('Do some server side logic');}]]></xp:this.action>
                  </xp:eventHandler>
              </xp:button>
          </xp:div>
      
          <xe:dialog id="dlgModal" title="Modal Dialog (only shown if validation not fails!)"></xe:dialog>
      
      </xp:view>
      

      【讨论】:

      • 感谢乔治。因此,如果我理解正确,如果字段验证失败,则不会运行任何代码,而是会刷新一个显示错误的面板?理想情况下,我想使用已经存在的框架,我们使用咆哮通知显示消息。这显然涉及要运行的客户端或服务器端代码。是否有任何客户端代码可以用来处理验证是否失败。例如在您的代码 facesContext.getMaximumSeverity() 中。如果我能做到这一点,我可以写一个简单的 if 语句。 If (NOMESSAGES) do THIS else THAT 并放入 onComplete?
      • 另外,如果验证失败,onError 中的代码会运行吗?如果是这样,我显然可以将代码放在 onError 和 onComplete 中,而不是在我无法处理验证失败的情况时执行 if 语句......
      • 我会做一些进一步的调查
      • growl notifications 是什么意思,这是第三方产品吗?
      • Georg,我实现了bootAlert,这是Michael Smith编写的自定义控件。我认为它很棒,非常易于使用,而且外观和感觉都非常好。如果您想看一下,请在此处查看 Michael 的博客:xpage.me/2015/02/10/boot-your-alerts-in-the-with-bootalert
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      相关资源
      最近更新 更多