Ajax 在执行中使用特定 ID 提交仍然会提交整个表单

Ajax submit with specific IDs in execute still submits entire form

据我了解,在 f:ajax 标记的 execute 中指定 ID 应该限制发布到服务器的字段。

    <h:form>
        <h:inputText id="one" value="#{manageSettingsBean.testOne}"/>
        <h:inputText id="two" value="#{manageSettingsBean.testTwo}"/>

        <h:commandButton value="Multi test" action="#{maintainEntityAction.multi(manageSettingsBean.testOne, manageSettingsBean.testTwo)}">
            <f:ajax execute="@this one"/>
        </h:commandButton>
    </h:form>

在这种情况下,我预计只会提交第一个 inputText

但是,在检查 Chrome 的“网络”选项卡中的表单数据时,我看到了

j_idt13=j_idt13&j_idt13%3Aone=One&j_idt13%3Atwo=Two&javax.faces.ViewState=-8624538035389330252%3A2147742525648157763&javax.faces.source=j_idt13%3Aj_idt14&javax.faces.partial.event=click&javax.faces.partial.execute=j_idt13%3Aj_idt14%20j_idt13%3Aone&javax.faces.behavior.event=action&javax.faces.partial.ajax=true

其中包含两个组件及其默认值("One""Two")。

j_idt13:one=One
j_idt13:two=Two

第一个组件在 javax.faces.partial.execute 中指定,因此它是唯一更新的组件,但两个字段似乎都已提交。我将部分提交作为大型表单的一部分进行,以避免发布过多数据,但如果仍在提交整个表单,好处似乎会丢失?

execute属性与是否提交字段无关。它会影响它们在服务器上的处理。所以在这方面你的期望是错误的,一切都按预期运行。

PrimeFaces 为此引入了 partialSubmit,它使用 process 属性(execute 的对应属性)来限制实际提交的内容。

基于此我为另一个问题创建了一些代码 that makes this work on plain JSF as well and at the same time I submitted a feature request to OmniFaces to add the same functionality to the OmniFaces o:form. They improved it a little and added it to the upcoming release which you can already try as a 3.0-SNAPSHOT