javascript - 提交时禁用 JSF 表单字段验证

标签 javascript validation jsf

我有一个<h:selectOneMenu> 。根据选择的内容,将显示众多 <div> 之一与选择相关的内容将被隐藏。 每个<div>有一些<h:inputText>写入不同的@ViewScoped bean 。其中一些 <div>甚至可以写入 bean 中的相同属性。

例如。

<div>
    <h:outputLabel for="list" value="Items"/>
    <div>
        <h:message for="list"/>
        <h:selectOneMenu id="list" value="#{bean.selectedItem}" >
            <f:selectItem itemLabel="Select one"></f:selectItem>
             <f:selectItems value="bean.someItemsList" />
        </h:selectOneMenu>
    </div>
</div>

<div id="item1">
    <!-- some other input fields -->
    <div>
        <h:message for="item1input1"/>
        <h:inputText id="item3input1" value="bean.thisIsTheSameProperty" />
    </div>
</div>
<div id="item2">
    <!-- some other input fields -->
</div>
<div id="item3">
    <!-- some other input fields -->
    <div>
        <h:message for="item3input1"/>
        <h:inputText id="item3input1" value="bean.thisIsTheSameProperty" />
    </div>
</div>

问题:当我选择一个项目时,将显示 <div> (例如 <div id="item1"> ),还有另一个隐藏的 <div> (例如 <div id="item3"> )写入相同的 bean 属性(例如 value="bean.thisIsTheSameProperty" ),并且此属性用 javax.validation.constraints.@NotNull 进行注释,即使我为此输入字段赋予一个值,当我提交表单时,我认为 JSF 也会运行隐藏的 <div> (通常没有输入集)。

我在调试过程中看到的情况:提交表单时,我看到 bean 的 setter 将被调用两次。第一次将使用我输入的正确值设置 bean 属性,但第二次将使用空值调用 setter 。所以验证会因为@NotNull而失败。

我的假设是 JSF 尝试设置 Bean 值两次,其中一次针对所示 <div> 上的输入字段第二次为隐藏<div> (因为它们指向相同的 bean 属性),但对于隐藏 bean,没有设置输入字段(它们为 null)。

我显示/隐藏 <div>取决于从 <h:selectOneMenu> 中选择的项目,使用 jQuery 。 例如。

$('#item1').show();
$('#item1').hide();
$('#item2').show();
$('#item2').hide();
$('#item3').show();
$('#item3').hide();

有没有办法让JSF不考虑隐藏<div>到底是什么?

最佳答案

您似乎假设隐藏输入(通过 CSS 隐藏)不会提交到服务器。这个假设是错误的,顺便说一句,它是一个普通的 html 东西,根本与 JSF 无关。

参见例如Stop an input field in a form from being submitted

但是,它仍然允许通过浏览器开发工具进行客户端操作来“攻击”您的应用程序。与所有大肆宣传的 javascript UI 框架相反,JSF 是一个成熟的' MVC framework ' 内置了针对 client-side manipulation/tampering and CSRF, XSS 的保护为此,您需要其他框架中的 OWASP 相关功能。 (这一点和其他因素使得 JSF(带有 PrimeFaces、OmniFaces 和 DeltaSpike)对我来说仍然是一个快速开发面向业务的应用程序的出色框架。)

您最好使用ajax conditionally render one div or the other但你不能 'update' the divs当它们被定义为你拥有它们时。

另请参阅:

关于javascript - 提交时禁用 JSF 表单字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558725/

相关文章:

javascript - AngularJS如何限制双击/多次点击

javascript - javascript、php、html 和 mysql 查询中的多语言字符

c# - 如何检测代码中的 ViewModel 绑定(bind)错误?

c# - 当模型是子模型的集合时验证表单

java - 阻止用户向页面发出 GET 请求

java - 我应该给支持 beans 另一个名字而不是类吗?

javascript - FireFox 4 不再支持可滚动的 TBody - 解决方法?

javascript - JavaScript websocket可以从服务器获取返回值吗?

javascript - 如何找到容器内的所有事件并委托(delegate)它们

ruby-on-rails - Rails 外键验证