visualforce中的reRender和呈现属性

时间:2013-02-24 13:37:54

标签: salesforce apex-code visualforce

我写了一个包含源代码的visualforce页面

<apex:page controller="MyController1">
<apex:form>
<apex:pageBlock >
<apex:pageBlockSection  id="search">
<apex:commandLink action="{!commandLinkAction}" value="Advance Search"  reRender="thePanel" id="theCommandLink"/>
<apex:outputPanel id="thePanelWrapper">
<apex:outputPanel id="thePanel" rendered="{! rend}" layout="block">My div</apex:outputPanel>
</apex:outputPanel>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>

,MyController1类是

public class MyController1{
public Boolean rend{get;set;}
public PageReference commandLinkAction(){
rend=true;
return null;
}

}

当我点击高级搜索链接时没有任何反应但是我期待带有id“thePanel”的outputPanel应该渲染。为什么它不渲染请有人解释?

3 个答案:

答案 0 :(得分:2)

如果你点击链接面板不在页面上,SF就不会渲染它。

答案 1 :(得分:1)

正如@Shimshon所说,当从Visualforce生成HTML代码时,标记为rendered="false"的Visualforce组件不会显示在生成的HTML文档中。

在这种情况下:

<apex:outputPanel id="thePanel" rendered="{! rend}" layout="block">

如果要重新呈现此面板,则必须确保该组件将显示在HTML代码中,以便重新呈现操作可以找到它。由于{! rend}最初在控制器的构造函数中设置为false,因此“thePanel”永远不会在页面中呈现,因此您尝试重新呈现不存在的组件。

@theGreatDanton的解决方案将起作用,因为<apex:outputPanel id="thePanelWrapper">是始终呈现的容器面板:

<apex:commandLink action="{!commandLinkAction}" value="Advance Search"  reRender="thePanelWrapper" id="theCommandLink"/>

如果此面板由rerender属性指向,则“thePanelWrapper”及其子节点(“thePanel”)将被更新。

答案 2 :(得分:0)

尝试以下代码。

<apex:page controller="MyController1">
<apex:form>
<apex:pageBlock >
<apex:pageBlockSection  id="search">
<apex:commandLink action="{!commandLinkAction}" value="Advance Search"  reRender="thePanelWrapper" id="theCommandLink"/>
<apex:outputPanel id="thePanelWrapper">
<apex:outputPanel id="thePanel" rendered="{! rend}" layout="block">My div</apex:outputPanel>
</apex:outputPanel>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>

public class MyController1{
   public Boolean rend{get;set;}
   //setting the boolean to false in the constructor
   public MyController1(){
          rend = false;
   }
   public void commandLinkAction(){
      rend=true;
     // return null;
   }

}

希望这会有所帮助!!