2012-03-14 65 views
0

我試圖通過apex:param標記傳遞靜態資源URL。我到目前爲止的代碼是:Visualforce將靜態資源URL傳遞給Apex

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; } 

我頂點的認識:PARAM是我現在能夠以後調用控制器變量重新呈現已經發生,並且它們將被填充靜態資源URL。但不幸的是我一直收到空。

任何人都知道爲什麼它不工作?

回答

3

它適用於您爲參數提供名稱的情況--- Visualforce不會在此上下文中處理參數,除非它們已被命名。

<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代碼的其餘部分,使我們能看到「畫廊」和「scriptPanel」是相對於你的頂點表單標籤---讓rerender正確工作是非常棘手的,並且完全依賴於DOM元素被重新分級的層次位置。爲了保證畫廊和scriptPanel成功地重新呈現,把它們放在不同outputPanels頂點表單標籤之外,像這樣:

<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查詢。

+0

不錯,很高興你能夠得到它的工作。另外,針對我的回答的評論應該是對我的回答的評論,而不是你的回答。 – 2012-03-15 14:45:46

+0

感謝馬修---我想評論你的帖子,但我不能。也許我必須要有更高的聲譽? – zachelrath 2012-03-15 14:50:36

+0

Np,謝謝。 – 2012-03-15 15:03:35

0

{!URLFOR($Resource.NoImage)}並不意味着被用作控制器/擴展變量。它是對靜態資源的直接引用(不需要控制器/擴展)。

我會建議您使用輸出面板,將渲染屬性綁定到由動作函數控制的Apex變量。這樣,您可以通過顯示或隱藏輸出面板來顯示或隱藏每個版本的圖像。

另外,你可能想看看使用JavaScript Remoting這樣的事情。