使用在WebSphere 8.5.5中运行的PrimeFaces 5.3
我有一个包含两个必填字段的表单,inputText
和selectOneMenu
。我在菜单中选择了一个有效值(例如无状态),但将文本字段留空会导致错误。然后我更正文本字段,但用户也按下菜单上的“S”键 - 打算再次选择“无状态”,但结果是“选择国家”,这意味着没有选择 - 另一个验证错误。
当用户按下ENTER时,他们会收到selectOneMenu
的另一条错误消息,并且该字段本身会突出显示为错误,但会显示“无状态”的有效值 - 这让我很难想象用户的用途反应!
有没有办法始终保留用户输入的值?
我附加了用于演示此问题的清理代码。我有菜单列出所有国家(以及美国各州,墨西哥州,加拿大各省),因此无法为默认值分配一个不适用于有效值的字母。
XHTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<!-- IE standards mode override *must* appear first - use resource ordering facet to force this. -->
<f:facet name="first">
<meta http-equiv="x-ua-compatible" content="IE=edge" />
<!--
<meta http-equiv="x-ua-compatible" content="IE=edge" />
^ Prevents IE from reverting to 'IE7 Standards Mode' when accessing via non-localhost hostname.
Must appear immediately after <title> element. Note that setting this at the server level (ie: in websphere)
is considered preferable. See: http://stackoverflow.com/questions/6156639/x-ua-compatible-is-set-to-ie-edge-but-it-still-doesnt-stop-compatibility-mode
-->
</f:facet>
</h:head>
<h:body>
<br/>
<h:form id="dataForm">
<p:outputLabel for="note" value="Note"/>:
<p:inputText id="note" size="30" maxlength="50" value="#{Test.note}" required="true" />
<br />
<p:outputLabel for="citizenship" value="Citizenship:"/>
<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true">
<f:selectItem itemLabel="Select Country..."/>
<f:selectItem itemValue="1" itemLabel="Canada"/>
<f:selectItem itemValue="2" itemLabel="United States"/>
<f:selectItem itemValue="3" itemLabel="Mexico"/>
<f:selectItem itemValue="-1" itemLabel="Stateless"/>
</p:selectOneMenu>
<br />
<p:commandButton value="Save" type="submit" action="#{Test.save}" ajax="false" />
</h:form>
</h:body>
</html>
爪哇
import javax.inject.Named;
@Named ("Test")
public class Test
{
private String note;
private Integer citizenship;
public Integer getCitizenship()
{
return citizenship;
}
public String getNote()
{
return note;
}
public void setNote(String note)
{
this.note = note;
}
public void setCitizenship(Integer citizenship)
{
this.citizenship = citizenship;
}
public String save()
{
System.out.println("Citizenship=" + this.citizenship);
return "test";
}
}
修改
应用以下修改但它根本没有效果。当我按下“S”时,它仍会选择“选择国家...”选项,如果我点击控件,我仍然可以看到并选择“选择国家...”选项。
<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">
<f:selectItem itemValue="#{null}" itemLabel="Select Country..." noSelectionOption="true"/>
我在浏览器调试器中详细研究时发现了其他一些问题。当我选择不同的选项时,HTML选项元素的选定值不会改变 - 而不是标签。实际的HTML select元素位于DIV中,类为“ui-helper-hidden-accessible”。我想知道这是否意味着......
答案 0 :(得分:0)
因此,它指定“输入组件在验证失败时将其本地值保持在状态”。这让我相信你在这里遇到的问题是select country选项缺少itemLabel标记。我通常会将其分配为It throws this: Unable to start activity ComponentInfo{com.my.class/com.my.class.aoeifjaweof}: java.lang.RuntimeException: Font asset not found
或itemLabel = ""
。 null
还有一个noSelectionOption
选项可能有所帮助。
这个答案在一段时间内帮助我解决了类似的问题:Best way to add a "nothing selected" option to a selectOneMenu in JSF
答案 1 :(得分:0)
好的我找到了解决问题的方法 - 基本上我从PrimeFaces版本切换到普通JSF。那就是:
<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">
要
<h:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">
我们被允许在WebSphere上使用的PrimeFaces版本似乎有问题 - 这恰好是我第三次通过切换到普通JSF来“解决”问题。