gpt4 book ai didi

java - jsf 1.2 验证并关闭后弹出窗口不上传新数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:15 25 4
gpt4 key购买 nike

我正在使用弹出窗口,该弹出窗口位于丰富的模型面板上当我尝试创建新值并单击“保存”按钮,并且在所需的位置没有值时,我会收到错误消息(就像我想要的那样!!!!),但是如果这个人在下次加载此弹出窗口并调用 showmodelpanel 时单击关闭(x 按钮)(在更新模式下,我尝试从 jsf bean 中获取城市值),则不会写入任何值(应该有一个!!!!!!这是我的错误)

我希望在有人关闭我的弹出窗口后,甚至认为他从验证方面得到了错误消息“下次他打开弹出窗口时将输入新值

注意:禁用的面没问题,但插入值则不行(奇怪......)

有人可以解释一下问题是什么(可能是关于 jsf faces 的问题,验证错误后如何将页面恢复到原始状态?)

  <rich:modalPanel id="DefineEntityAddress" width="400" height="300"
autosized="true">
<h:graphicImage value="/images/close.png" styleClass="hidelink"
id="DefineEntityAddressHidelink" />
<rich:componentControl for="DefineEntityAddress"
attachTo="DefineEntityAddressHidelink" event="onclick"
operation="hide">

。。.

 <h:form>
<t:div style="display:block;height:17px;">
<rich:comboBox required="true" id="suggestionBoxCity"
value="#{DefineEntityAddressControl.chossenCity}"
suggestionValues="#{DefineEntityAddressControl.allCityNames}"
directInputSuggestions="true" required="true"
disabled="#{DefineEntityAddressControl.readOnly}"
listStyle="text-align: right;" tabindex="12">
<a4j:support event="onchange" reRender="suggestionBoxStreet"></a4j:support>
</rich:comboBox>
</t:div>
<a4j:outputPanel ajaxRendered="true">
<t:message for="suggestionBoxCity" styleClass="dyna_error"></t:message>
</a4j:outputPanel>
</a4j:region>


<a4j:commandButton id="save" value="#{l.save}"
oncomplete=" closeModalPanel();"
reRender="hidden,saveError,saveError1,#{DefineEntityAddressControl.ok ? DefineEntityAddressControl.callinglabalTorerender : l.end_date}"
disabled="#{DefineEntityAddressControl.toDelivery}"
action="#{DefineEntityAddressControl.save}"
styleClass="actionButton" />

</h:form>

</rich:modalPanel>

最佳答案

这是一个已知的 JSF“功能”。提交表单后,JSF 树中的组件将使用提交的值进行更新。然后验证失败,因此模型(DefineEntityAddressControl.chossenCity 等)不会更新。但提交的值仍然在组件树中,并且 JSF 在 UI 上合法地呈现该值(允许用户更正该值)。

解决方案是在单击“关闭”按钮时清除提交的值。

/**
* Clears all the submitted values of input components in the same form as the specified component.
* Call this method from action listener, e.g.
* In Java bean:
* {@code
* public void processCloseAction(ActionEvent e) {
* clearSubmittedValues(e.getComponent());
* }
* }
*
* At page:
* {@code
* <a4j:commandButton actionListener="#{bean.processCloseAction}"
* ajaxSingle="true"
* limitToList="true"
* oncomplete="Richfaces.hideModalPanel('#{id}')"
* value="Cancel"/>
* }
*
* @param component child of the form to be cleared
*/
public void clearSubmittedValues(UIComponent component) {
while (component != null) {
if (component instanceof UIForm || component instanceof UIAjaxRegion
|| component instanceof UIModalPanel) {
clearRegion(component);
}
component = component.getParent();
}
}

public void clearRegion(UIComponent parent) {
for (UIComponent component : parent.getChildren()) {
if (component instanceof EditableValueHolder) {
EditableValueHolder input = ((EditableValueHolder) component);
input.setSubmittedValue(null);
// The following is only needed for immediate input components
// but it won't do any harm in other situations..
input.setValue(null);
input.setLocalValueSet(false);
} else {
clearRegion(component);
}
}
}

关于java - jsf 1.2 验证并关闭后弹出窗口不上传新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com