Visualforce将静态资源URL传递给Apex

时间:2012-03-14 21:26:38

标签: salesforce apex-code visualforce

我正在尝试通过apex:param标记传递静态资源URL。我到目前为止的代码是:

VisualForce:

<apex:selectList value="{!SelectedFamily}" onchange="renderGallery();" size="1" label="Product Family">
    <apex:actionFunction name="renderGallery" rerender="gallery" oncomplete="renderScripts();">
        <apex:param value="{!URLFOR($Resource.NoImage)}" assignTo="{!noImage}"/>
        <apex:param value="{!URLFOR($Resource.NoImageThumb)}" assignTo="{!noImageThumb}"/>
    </apex:actionFunction>
    <apex:actionFunction name="renderScripts" rerender="scriptPanel"> 
    </apex:actionFunction>
    <apex:selectOptions value="{!Family}" />
</apex:selectList>

控制器:

public string noImage{ get; set; };
public string noImageThumb { get; set; }

我对apex:param的理解是,我现在可以在重新渲染发生后调用控制器变量,并且它们将填充静态资源URL。但不幸的是我一直无效。

任何人都知道它为什么不起作用?

2 个答案:

答案 0 :(得分:3)

如果为params提供名称,它就有效 - 除非它们被命名,否则Visualforce不会在此上下文中处理params。

<apex:actionFunction name="renderGallery" rerender="gallery" oncomplete="renderScripts();">
       <apex:param name="noImg" value="{!URLFOR($Resource.NoImage)}" assignTo="{!noImage}"/>
       <apex:param name="noImgUrl" value="{!URLFOR($Resource.NoImageThumb)}" assignTo="{!noImageThumb}"/>
</apex:actionFunction>

如果这对您不起作用,请发布您的Visualforce代码的其余部分,以便我们可以看到“gallery”和“scriptPanel”与您的顶级表单标记相关的位置 - 让我们重新投入工作正确地说是非常棘手的,并且完全依赖于被重新渲染的DOM元素的层次结构位置。要保证gallery和scriptPanel成功重新呈现,请将它们放在apex form标记之外的单独outputPanel中,如下所示:

<apex:outputPanel id="scriptPanel">
     Selected Family: {!SelectedFamily}<br/>
</apex:outputPanel><br/><br/>


<apex:outputPanel id="gallery">
     No Image: {!noImage}<br/>
     No Image Thumb: {!noImageThumb}<br/>
</apex:outputPanel><br/><br/>

@MatthewKeefe,绝对没有理由为什么{!URLFOR()}不能用作扩展变量---它编译成文本(例如'/ resource / 123718923'),所以Jim的解决方案实际上很漂亮有趣的是,因为它使他不必对他的控制器中的StaticResource对象进行SOQL查询。

答案 1 :(得分:0)

{!URLFOR($Resource.NoImage)}并不打算用作控制器/扩展变量。它是对静态资源的直接引用(无需控制器/扩展)。

我建议你使用输出面板,其渲染属性绑定到由动作函数控制的Apex变量。这样,您可以通过显示或隐藏输出面板来显示或隐藏图像的每个版本。

或者,您可能希望使用JavaScript Remoting来查找此类内容。