验证后的Tapestry区域渲染

时间:2013-06-14 12:13:35

标签: tapestry

我在表单中有一个Select Enum组件,用于在更改时更新区域。这很好用:

<t:select t:id="anEnum" validate="required" zone="${getZone()}" />

public String getZone() {
    if (anEnum== AnEnum.TYPE1) {
        return "zone1";
    } else if (anEnum== AnEnum.TYPE2) {
        return "zone2";
    } else {
        return "zone3";
    }
}

@OnEvent(value = EventConstants.VALUE_CHANGED, component = "anEnum")
public Object updateDisplay(AnEnum anEnumIn) {
    anEnum= anEnumIn;
    if (anEnum== AnEnum.TYPE1) {
        return zone1.getBody();
    } else if (anEnum== AnEnum.TYPE2) {
        return zone2.getBody();
    } else {
        return zone3.getBody();
    }
}

我遇到的问题是,当我提交表单并且在onValidate方法的java类中处理验证时,页面会显示错误的区域 - 通常是区域3(这可能是有意义的,因为它的'else'返回上面的方法)。我如何获得正确的区域再次渲染 - 我在anEnum上尝试了@persist而没有运气,而且以下也没有工作

@SetupRender
void setupRender() {
  updateDisplay(anEnum);
}

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

您正在检查anTypeEnum中的getZone()实例变量,您要在anEnum中设置updateDisplay()实例变量。如果这不是你问题中的拼写错误,那就是你的问题。

如果这是拼写错误,anTypeEnum由于某种原因将为空。但是如果没有完整的代码,我无法评论这是怎么回事。如果您没有@Persist,则会在表单提交和页面呈现之间清除它,或使用onPassivate()onActivate()在请求之间保留值。它应该与@Persist一起使用,因此您必须将其设置为以某种方式为空。请分享您的完整组件/页面代码。

PS:取代zone="${getZone()}"使用zone="zone"

答案 1 :(得分:0)

我找到了问题的答案 - 如果我之前发布了更全面的代码,可能是社区成员找到的(已吸取经验教训!)。

按照一个例子我已经看到(道歉我已失去链接)使用Select我已经将我的两个区域之一设置为visible =“false”更新区域。

<t:zone t:id="zone1" id="Zone1" visible="false">

这意味着即使在验证后重新呈现页面,visible = false也是先例。我已经更新了代码来调用java中的方法来检查区域是否可见。

TML

<t:zone t:id="zone1" id="Zone1" visible="${isZoneVisible()}">

的java

public boolean isZoneVisible() {
    if (anEnum== AnEnum.TYPE1) {
        return false;
    }
    return true;
}

按照joostschouten的建议将@persist添加到anEnum也是一个好主意。

很高兴地说现在一切正常。