我知道asp.net中有一个属性(可能是“<%@ Page%>标记”的EnableEventValidation)。当我尝试使用javascript向组件添加选择项时,一旦出现问题,我想要知道jsf如何处理这个问题。就是这样,
如果我发送一个h:select * like like,并且客户端在项目列表中添加一个新项目“option3”,则jsf会在更新模型值之前自动检测到这一点。
<h:selectOneMenu id="type"
value="#{foo.value}"
required="true"
requiredMessage="Type is required"
style="width:100px">
<f:selectItem value="option1}"/>
<f:selectItem value="option2}"/>
</h:selectOneMenu>
答案 0 :(得分:1)
我认为您需要了解的有关JSF的内容是组件的客户端/服务器部分紧密耦合在一起。你可能最好把它们当作一个实体来考虑它们,而忘记仅仅摆弄一面,当它是唯一的解决方案时,回到自定义Javascript。
另一种思考方式是服务器端呈现客户端,反之亦然!因此,每当您需要更新组件时,必须首先在服务器端完成更新,这将传播到客户端(浏览器)。
在您的示例中,向select*
项添加和元素的正确方法是将可选项存储在bean中的数据结构中(可能是@ViewScoped
),然后通过用于select*
组件或其容器组件的AJAX,当服务器端有机会了解更改并且也可以正确更新客户端时。
当然,你可以通过Javascript破解你的方式,但为什么要使用JSF? JSF的重点是避免像这样的黑客攻击。
请记住,JSF不是JSP,它基本上是html输出的println宏。 JSF将页面组件的表示存储在服务器端,镜像浏览器的表示。
查看Primefaces showcase有关如何进行部分更新的示例。更具体地说,this is the example你可能正在寻找。这在标准JSF2中可用,对于JSF 1.2,您必须使用组件库来获得AJAX支持。
答案 1 :(得分:0)
您不应该通过JavaScript添加新选项,但是您应该通过JSF添加新选项。为了允许提交的值,JSF需要以某种方式了解新选项。新选项确实需要由<f:selectItem(s)>
提供。否则,在提交由JS添加的选项值时,您将始终面对Validation error: Value not valid
。毕竟这只是JSF的一个保护措施,可以防止客户操纵请求并提交他们不应该提交的值。
以下启动示例应该有效:
<h:form>
<h:selectOneMenu id="menu" value="#{bean.item}">
<f:selectItems value="#{bean.items}" />
</h:selectOneMenu>
<h:inputText id="newItem" value="#{bean.newItem}" />
<h:commandButton value="add" action="#{bean.addNewItem}">
<f:ajax execute="@this newItem" render="menu" />
</h:commandButton>
<h:commandButton value="submit" action="#{bean.submit}" />
</h:form>
使用@ViewScoped
托管bean,如下所示:
private String item;
private List<String> items = Arrays.asList("option1", "option2");
private String newItem;
public void addNewItem() {
items.add(newItem);
}
// ...