Tapestry 5.3.8 提交包含区域的表单

Tapestry 5.3.8 Submit form containing zone

在我的 tml 中,我有一个字段由区域更新的表单

简体 tml:

<form t:id="editUserForm" t:zone="editRefresh" t:type="form"> 

                    <label>Search For User to Edit: </label>
                    <input type="text" id="editUser"  /> 

        <t:any 
                t:id="addNew"
                element="button"  
                t:mixins="observe" 
                event="click" 
                zone="editRefresh"
                fields ="['editUser']" > 
                Edit Selected User
        </t:any>        

                <t:zone t:id="editRefresh"> 

                ...Fields here updated

                <input t:type="submit" t:id="editUserButton" value="Edit User" />

            </t:zone>
         </form>

字段填充没有问题,但是在提交表单时我收到了:

Render queue error in SetupRender[app/Administration:editloginname]: Component app/Administration:editloginname must be enclosed by a Form component.

查看日志发现后台代码还在执行,然后抛出这个错误。

另外 - 有没有办法在提交时刷新页面?我在表单标签中指定了一个 t:zone ,因此当按下 t:any 按钮时表单不会刷新并且区域会更新,但是当提交表单时我希望它像往常一样工作。

作为解决方法,我注入了表单所在的页面并进行了更改

return editRefresh.getBody();

return adminPage;

作为一种变通方法,这可以正常工作,但我认为这不是理想的方法。

您无法在不包含表单的情况下呈现表单域。这是因为 Tapestry 在呈现其字段时将一些内部状态存储在表单的隐藏输入中,如果您将字段与表单分开呈现,您最终会得到无效的表单状态。

查看此答案以了解可用选项:

关于在提交时刷新页面:您可以继续使用您的解决方法,因为它是完全有效的。如果您不想将组件与包含页面耦合,您可以在页面级别处理表单提交事件和 return this;(记住 Tapestry events are bubbled)。

或者从表单组件中删除 t:zone 属性。没有 t:zone 表单提交将不会使用 AJAX.

不知道我对你的问题的理解是否正确,但是如果你想将表单的某些元素放入区域,你可以这样做:

http://jumpstart.doublenegative.com.au/jumpstart/examples/ajax/select1

这个例子对我很有帮助,希望对你也有帮助。