【问题标题】:Validate h:selectOneMenu and t:inputFileUpload with f:ajax blur使用 f:ajax 模糊验证 h:selectOneMenu 和 t:inputFileUpload
【发布时间】:2011-11-14 16:49:28
【问题描述】:

我想在提交表单之前验证 h:selectOneMenut:inputFileUpload 是否具有有效值。我有这段代码,但是当我离开 selectOneMenu 时它没有显示 h:message,t:fileInputUpload 也会发生同样的事情。

            <h:form id="uploadForm" enctype="multipart/form-data">
                <h:panelGrid columns="3">
                    <h:outputLabel for="option" value="Operación:" />
                    <h:selectOneMenu id="option" value="#{menu.infoMenuItem}"
                                     required="true"
                                     converterMessage="Opción no valida !" >
                        <f:selectItem itemLabel="Seleccione una opcion..." itemValue="null"/>
                        <f:selectItems value="#{menu.infoMenuItems}" />
                        <f:ajax event="blur" render="optionMessage" />
                    </h:selectOneMenu>
                    <h:message id="optionMessage" for="option" style="color: #FF0000;" />

                    <h:outputLabel for="upfile" value="Archivo: " />
                    <t:inputFileUpload id="upfile" value="#{uploadFile.upFile}"
                                       required="true">
                        <f:ajax event="blur" render="uploadMessage" />
                    </t:inputFileUpload>
                    <h:message id="uploadMessage" for="upfile" style="color: #FF0000" />

                    <h:panelGroup />
                    <h:commandButton value="Continuar"
                                     action="#{uploadFile.upload}">
                    </h:commandButton>
                </h:panelGrid>
            </h:form>

另外,如果前面的组件没有有效值,是否有办法阻止提交表单?

干杯!

我正在使用 Mojarra 2.1.4 和 Tomahawk 1.1.11(用于上传)

【问题讨论】:

  • 您忘记详细说明“它不起作用”。
  • 抱歉,我已经更新了帖子。

标签: ajax validation jsf file-upload jsf-2


【解决方案1】:

当我离开 selectOneMenu 时它不显示 h:message

到目前为止发布的代码看起来不错。问题是在其他地方引起的。也许您正在嵌套 HTML &lt;form&gt;s,这是无效的。确保您没有嵌套 JSF &lt;h:form&gt; 组件。有关其他原因,另请参阅commandButton/commandLink/ajax action/listener method not invoked or input value not updated


t:fileInputUpload 也会发生同样的事情。

不幸的是,HTML4 &lt;input type="file"&gt; 元素和 XHR1 ajax 不能很好地结合使用。确定文件是否被选中需要multipart/form-data ajax 请求,该请求仅在 HTML5/XHR2 中受支持(到目前为止,PrimeFaces 3.0 是唯一支持此功能的 JSF 组件库——理论上!我还没有测试过)。因此,&lt;t:inputFileUpload&gt; 完全忽略了 ajax 验证请求。由于 JSF/Tomahawk 只是一个 HTML 代码生成器,所以在这里它不能为您做任何事情。你能做的最好的就是通过普通的 JS/HTML 来验证它。

<t:inputFileUpload id="upfile" value="#{bean.file}" required="true" 
    onblur="document.getElementById('uploadMessage').style.display = (!value) ? 'block' : 'none'"
/>
<h:panelGroup>
    <h:message for="uploadMessage" style="color: #FF0000" />
    <span id="uploadMessage" style="display: none; color: #FF0000">Seleccione una archivo...</span>
</h:panelGroup>

&lt;h:message&gt; 保留在原位,以便在您按下命令按钮时无论如何都会显示服务器端验证消息 - 这会触发同步(非 ajax)请求) p>


与具体问题无关,您应该更喜欢将 JS 和 CSS 代码放在自己的 .js.css 文件中,这些文件由 &lt;script&gt;&lt;link&gt; 包含在 &lt;h:head&gt; 中.

【讨论】:

  • 哦,是的,事实上我有一些嵌套的表单,这是因为我有一个渲染其他组件的 **selectOneMenu **,所以我认为我应该有一个嵌套的表单,但我会检查它并修复那。所以每页应该只有一个表单?
  • 不,每个表单使用一个&lt;h:form&gt; :) 例如,如果您在同一页面中有登录表单和搜索表单,则每个表单都应该有自己的&lt;h:form&gt;。您不想从一个表单提交/验证另一个表单。另见另见stackoverflow.com/questions/7371903/…
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多