>我的JSF页面中有一个按钮,用于保存项目。
<p:commandButton id="saveB" actionListener="#{projectsController.create}" value="Projeyi Kaydet" icon="ui-icon-check" onsuccess="infDialog.show()" onerror="infDialog.hide()"/>
当我单击它时,它会保存项目并打开对话框并说它已保存。这是我的对话框:
<p:dialog id="msgDialog" header="Bilgi" widgetVar="infDialog" resizable="true" showEffect="explode" hideEffect="explode" appendToBody="true" modal="true" closable="false">
<h:form>
<h:panelGrid id="display" columns="2" cellpadding="10" style="margin:0 auto;">
<f:facet name="header">
<center>
<h:outputText value="Proje kaydedildi." />
</center>
</f:facet>
<h:outputText value="Projeye döküman eklemek için aşağıdaki paneli kullanabilirsiniz." />
<f:facet name="footer">
<center>
<h:form enctype="multipart/form-data">
<p:fileUpload fileUploadListener="#{fileUploader.handleFileUpload}"
mode="advanced"
update="messages"
auto="false"
sizeLimit="100000000"
multiple="true"
allowTypes="/(.|/)(gif|jpe?g|png|pdf|avi|mpeg|mp4)$/"/>
<p:growl id="messages" showDetail="true"/>
</h:form>
</center>
</f:facet>
<br />
<br />
<center>
<p:commandButton value="Proje Eklemeyi Tamamla" onclick="window.location.replace(window.location.href);"/>
</center>
</h:panelGrid>
</h:form>
</p:dialog>
我在这里的问题是,当我不填写任何字段时,它仍然会显示并说项目已创建,而不是说您再次检查表单。
我怎样才能做到这一点?感谢您的任何想法。
首先,您的结构不正确,因为您嵌套了<form>
标签。这在HTML中是不正确的,所以在JSF中也是不正确的。
第二个onerror
回调与表单验证无关,但与 AJAX 请求中的错误有关。您应该更改onsuccess
和onerror
并使用如下所示的内容:
oncomplete="handleSave(xhr, status, args)"
并像这样定义 JavaScript 函数:
if (args.validationFailed) {
infDialog.hide()
} else {
infDialog.show()
}
validationFailed
是 ajax 回调参数,如果存在一些验证错误,则由 Primefaces 隐式设置为 true。如果需要,还应required="true"
属性添加到p:fileUpload
标记中。