2009-08-11 30 views
4

我知道這有一個簡單的答案,但這是以2個問題的形式出現的。如何將變量傳遞給JS文件

問題1:

在一個asp.net頁面有這樣一個JavaScript塊:

<script type="text/javascript"> 
    function doSomethingRandom() { 
     var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
    } 
</script> 

好了,這是問題的一個簡化版本,但應該清楚。我現在想把這個函數轉移到一個JS文件中......但是我不能將asp:Literal轉換成JS。

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
<script src="myJSFile.js" /> 

...讓我有點不舒服,有沒有更好的方法?

問題2:

類似的問題,但這次的第二個版本是這樣的:

<asp:ScriptManagerProxy runat="server"> 
    <Scripts> 
     <asp:ScriptReference Path="~/tree/AttributeTree.js" /> 
    </Scripts> 
</asp:ScriptManagerProxy> 

但這次我不能切實把

var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 

在它之上,因爲使用ScriptManagerProxy,沒有真正知道腳本文件將出現在哪裏的真正方法。

所以,他們的問題!謝謝。

回答

3

我們使用PageRegisterStartupScript方法向ClientScriptManager註冊初始化函數。我們的Javascript文件只包含功能,並通過ScriptManager加載(如在你的代碼片段中)。我們寫了一個擴展方法的第(稱爲JSStartupScript)與註冊啓動腳本幫助,並在這一天我們的代碼如下所示的末尾:

<% 
    Page.JSStartupScript(string.Format("initFeatureX({0}, {1}, {2});", 
     AntiXss.JavaScriptEncode(ViewData.Property1), 
     AntiXss.JavaScriptEncode(ViewData.Property2), 
     AntiXss.JavaScriptEncode(ViewData.Property3))); 
%> 

這也結合了ScriptManager作品大CompositeScript集合和LoadScriptsBeforeUI = false設置。

+0

+1,正如我在最近的一個項目 – 2009-08-11 09:16:24

1

基本上:你不能那樣做。

你可以做的是設置由ASP(如你現在)生成的網站上的值,然後從外部js腳本引用該變量,但這很醜。

另一種解決方案是,您可以將此變量存儲在一個cookie(將由ASP設置)中,然後在外部JS中讀取該cookie。您也可以將此值傳遞給您正在顯示的網站的URL,並在JS中解析URL以獲取值,但我認爲Cookie會更好,因爲您仍然擁有乾淨的URL,並且讀取Cookie更容易,然後解析url PARAMS。

+0

+1的Cookie。好主意。 – 2012-05-17 15:48:43

0

您可以使用aspx文件作爲js文件。

\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>

的,你可以做任何你在ASPX希望。

+0

上所做的那樣(刪除斜槓 - stackoverflow本來想剝去腳本標記) – 2009-08-11 09:16:38

+1

您將對該解決方案存在緩存問題,我很害怕。如果您不在鏈接中保留動態參數,您的瀏覽器可能會緩存它,並且不會下載因ID已更改而可能已更改的更新版本。如果您添加動態參數,則瀏覽器將在每次刷新頁面時下載此文件。 – RaYell 2009-08-11 09:25:38

0

另一種方式是動態加載JavaScript文件。 我的意思是這樣

<script> 
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" /> 
ComponentLoad("/tree/AttributeTree.js"); //here Javascript file will be loaded 
</script> 

但是,即使這不是最好的解決辦法。因爲會有很多全局變量比。 所以最好做到這一點:

<script> 
ComponentLoad("/tree/AttributeTree.js","doSomethingRandom",{myVarToUse:"<asp:Literal runat="server" ID="HackyLiteral" />"}); //here Javascript file will be loaded 
</script>