使用 widgetvar 后在 JSF+PrimeFaces 中提交表单的问题

Problem with submitting form in JSF+PrimeFaces after using widgetvar

我正在使用 widgetVar 在某些事件中通过 javascript 启用命令按钮。但是,启用命令按钮后,当我单击该按钮时,不会提交表单,也不会在服务器端调用操作。

如果我不使用 widgetVar 并默认启用按钮,同样的设置也能正常工作。它提交函数,调用操作并显示结果。

仅供参考,我正在使用 ajax 电话。

<p:commandButton id="btnSearch" value="Search" disabled="true"
    widgetVar="searchButton"
    ajax="true"
    action="#{someBean.someFunction(someBean.firstName, someBean.lastName)}">
    <p:ajax
        execute="firstName lastName"
        render="tabViewId:resultsDataTableId"
        onsuccess="showSearchResults()"/>
</p:commandButton>

Javascript -

function onSomeEvent(){
    PF('searchButton').enable();
}

请指教。

如果您在浏览器中调试“网络”选项卡,那么当按钮像这样启用时您可能会看到网络流量(另一方面,您可能看不到,但您应该检查一下)。所以这意味着向服务器的提交实际上正在发生,只是没有被处理。这是为什么?

它是设计使然,是 JSF 的原生功能,可防止客户端篡改 forms/data/... 其他现代(阅读大肆宣传)客户端 javascript 框架会需要额外的 OWASP 保护才能达到与 JSF 相同的安全级别。所以如果你想从客户端启用一个按钮,你应该调用 ajax 来更新按钮的状态(并检查客户端是否允许这样做)。或者您可以默认启用它,然后使用一些 javascript 最初禁用它。我个人会选择前者。