验证 – 无论如何在表单提交上验证只读组件

前端之家收集整理的这篇文章主要介绍了验证 – 无论如何在表单提交上验证只读组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们为具有工具或发行人的实体提供UI,但从不两者都有.您可以从弹出搜索对话框中选择其中一个,然后将其分配给实体.

用户可以在“搜索…”按钮旁边看到两者的编号和名称.这两个都必须是不可编辑的,即我们各自的< p:inputText ... readonly =“true”... />使输入变灰.

我们现在的要求是,当选择仪器和发行者中没有一个或两者时,不仅应该显示验证消息,而且用readonly =“true”标记的文本框以红色显示(连同他们的标签).

添加时,在按“保存”之前:

按“保存”后添加时:

我尝试了一些事情,然后我最终得到了OmniFaces< o:validateMultiple>,这似乎朝着正确的方向发展.但是,我注意到验证器没有启动,正如你可以从图像中看到的那样…(我刚刚删除了readonly =“true”以便你看到效果)

这是代码摘录:

  1. <!-- this panel is insider a form,yes -->
  2. <h:panelGroup id="subpanel"
  3. layout="block">
  4. <o:validateMultiple id="instrument-or-issuer-validator"
  5. validator="#{barrierCrossingManager.validateInstrumentOrIssuer}"
  6. components="instrument-isin instrument-description issuer-number issuer-name"
  7. message="..." />
  8. <!-- some panel grid with the inputs -->
  9. ...
  10. <p:panelGrid id="issuer-subpanel">
  11. <p:row>
  12. <p:column>
  13. <p:outputLabel for="issuer-number" value="#{msg['common.number.label']}:" />
  14. </p:column>
  15. <p:column colspan="3">
  16. <p:inputText id="issuer-number"
  17. value="#{barrierCrossingManager.selectedIssuer.nbr}"
  18. readonly="false" />
  19. </p:column>
  20. ...
  21. </p:row>
  22. </p:panelGrid>
  23. ...
  24. <h:messages id="msgs"
  25. layout="list"
  26. styleClass="subcontent-validation-msg-wrapper"
  27. showDetail="false"
  28. showSummary="true" />
  29. </h:panelGroup>

问:

你是如何解决这个问题的?

问题似乎是OmniFaces或JSF(?)不会对只读组件进行验证.我还查看了OmniFaces VDL for< o:validateMultiple>,但没有像allowReadOnlyComponentHighlighting或类似的标志.

还有另一种方式吗?

解决方法

出于安全原因,JSF确实会跳过处理(转换,验证和模型更新)中的只读(和禁用)字段.您不希望黑客无论如何都能通过操作请求参数来编辑这些值,对吧?出于明显的安全原因,OmniFaces也将以相同的方式跳过它们.

最好的办法是将EL表达式放在readonly属性中,在应用请求值和验证阶段(第2阶段和第3阶段)中评估为false,但在所有其他阶段都是如此.足以检查当前阶段序数是否为4或更大.这应该允许JSF无论如何都要对值进行验证.然后,您需要在呈现属性添加EL表达式,在更新模型值阶段(第4阶段)期间评估为false,以便不会更新模型值,因为在应用请求值和验证阶段期间readonly为false(和因此组件的local value设置,触发模型更新).

您可以通过#{facesContext.currentPhaseId}获取07年的当前JSF阶段,该阶段也在EL中. PhaseId依次是getOrdinal()方法返回相位索引(从1到标准相位为6).

总而言之,这应该是为了验证它们,但是阻止模型更新:

  1. <p:inputText
  2. readonly="#{facesContext.currentPhaseId.ordinal ge 4}"
  3. rendered="#{facesContext.currentPhaseId.ordinal ne 4}"
  4. />

猜你在找的HTML相关文章