我已经用 Java 创建了一个自定义 validator ,并在我的 XPage 上使用。所有数据都绑定(bind)到托管 bean(包括主数据实体的“子”数据集 - 行)。在我的验证方法中,我检查行组件(并找到它的一些“兄弟”来检查如果一个被填充,另一个也必须被填充或其值在一定的间隔内)。这对于普通字段(选择、输入和复选框)效果很好。
但是如何获得文件上传控件呢?如果选中同一行中的复选框,则必须附加图片。这是我的 fileUpload 的定义:
<xp:fileUpload id="fileUploadSingle" value="#{row.photo}"
disableClientSideValidation="true" required="true">
<xp:this.validators>
<xp:validator validatorId="fishingTripValidator"></xp:validator>
<xp:validateRequired message="You must attach a photo"></xp:validateRequired>
</xp:this.validators>
</xp:fileUpload>
我认为目前有两个问题:
如何触发“必需”服务器端。我已经通过将该字段设置为必填来对此进行了测试。在客户端工作正常 - 但不会触发服务器端...但是,如果填充了值(即选择了一个文件),则调用我的验证方法,并且我可以将该值读入 com.ibm.xsp.http .UploadedFile 变量并获取例如客户端文件名 (getClientFileName())。
当发现复选框已被选中时,获取文件上传控件 - 并测试文件上传控件中是否有指定的文件...
我可以找到正确的控件作为 UIComponent 并获取 com.ibm.xsp.component.UIFileuploadEx.UploadedFile 对象。请参阅此片段:
com.ibm.xsp.component.xp.XspFileUpload fileUpload = (com.ibm.xsp.component.xp.XspFileUpload) component;
if (null != fileUpload) {
com.ibm.xsp.component.UIFileuploadEx.UploadedFile uploadedFile = (com.ibm.xsp.component.UIFileuploadEx.UploadedFile) fileUpload.getValue();
if (null != uploadedFile) {
return uploadedFile.getFilename();
}
}
return null;
奇怪的是,当我选中该框并附加文件时 - 上面的代码将找不到该文件 - 并且 validator 返回错误。文件上传控件上显示的文件名现已消失。但是,如果我再次保存而不更改任何内容,那么代码片段中的文件控件现在可以正确找到该文件 - 因此不会引发验证错误并且文件已正确上传...
如果我可以触发对“必需”的验证,我想我可以避免其他“黑客”,其中显然在两个保存“之间”发生了一些事情。
关于如何正确控制这个的任何想法?
/约翰
最佳答案
解决方法是向每一行添加一个隐藏的输入字段。该字段的必填属性取决于复选框和文件上传控件:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="RTItem" action="editDocument" concurrencyMode="force" />
</xp:this.data>
<xp:repeat id="repeatFiles" rows="30" var="row" value="#{javascript:['A','B','C','D','E','F'];}">
<xp:checkBox text="File?" id="checkBoxFile" checkedValue="1" uncheckedValue="0" />
<xp:fileUpload id="fileUpload" value="#{document1[row]}" />
<xp:inputHidden id="inputHiddenFileHelper">
<xp:this.required>
<![CDATA[#{javascript:
var cmpCheck = getComponent( "checkBoxFile" );
var cmpFile = getComponent( "fileUpload" );
if( cmpCheck.value == "0" )
return false;
if( cmpFile.getValue() == null )
return true;
}]]>
</xp:this.required>
</xp:inputHidden>
<xp:br />
</xp:repeat>
<xp:messages id="messages1" />
<!-- a button to refresh the page -->
<xp:button value="Submit" id="buttonRefreshMe">
<xp:eventHandler event="onclick" submit="true" immediate="false" save="true"/>
</xp:button>
</xp:view>
关于java - 如何在自定义 validator 中检查文件上传控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507055/