2012-03-13 158 views
7

我是ASP.NET/MVC3的新手,我試圖弄清楚如何將HTML(其中包含C#)與其他H​​TML分開。在cshtml剃刀視圖中分離JavaScript

如果我把它們放入.JS文件並用腳本標記插入它們,那麼它們的C#方面停止工作。在MVC 3 razor中分離也包含C#代碼的JavaScript代碼的最佳方式是什麼?

謝謝。

+3

爲什麼你在你的JavaScript的一個*'C#aspect' *?你不應該。 – 2012-03-13 10:50:40

回答

0

如果在引用外部js文件時任何事情停止工作,也許你做錯了什麼。向我們提供一些關於如何引用外部文件的示例代碼。另一種方法是將JavaScript代碼放在文件某處的腳本標籤之間。如果它位於_Layout.cshtml中,您可以將它放在頭標籤和另一個cshtml文件中,將它放在腳本標籤之間。

1

Javascript代碼應該不是包含任何動態生成的代碼。如果您需要在某些配置設置中加載,則應使用定義變量的單個內聯腳本標記。其他選項將在動態生成的json配置文件中加載,或者根據dom內容進行加載,具體取決於您所需的特定動態信息。 (Ajax是我想說的最常見的方式,儘管這實際上取決於你的情況)。無論哪種方式,這個想法是,JavaScript和CSS文件是總是靜態。

9

由於多種原因,你最好把大部分,如果不是所有的JS到單獨的JS文件(這樣就可以利用再利用,縮小,瀏覽器的優化,內容分發網絡等)

要讀取的服務器端剃刀碼結果到您的JS文件使用下列方法之一:

1)把你的剃刀代碼到一個JavaScript變量在視圖(未測試代碼)

<script type="text/javascript"> 
    if(!MyGlobalVariables){ 
    MyGlobalVariables = {}; 
    } 
    MyGlobalVariables.IndexUrl = "@Url.Action("Index")"; 
</script> 

2)使用自定義屬性(最好以數據爲前綴,如HTML 5 spec中所建議的那樣)。在這裏看到相關討論:Can I add custom attribute to HTML tag?

<div data-index-url="@Url.Action("Index")"></div> 

然後,使用$(本).attr jQuery中(「數據索引網址」)來訪問所呈現的剃刀的標記。

3)將C#放入隱藏的輸入字段在您的視圖中,並閱讀您的JS文件中的隱藏輸入。

<input id="indexUrl" type="hidden" value="@Url.Action("Index")" /> 

要在jQuery的閱讀,你可以使用$( 「#indexUrl」)。VAL()

0

正如其他人所說編寫C#到您的.js文件可能是心不是各種原因,最好的辦法如緩存動態變量。但有時我們都必須做我們不應該做的事情。如果是這樣的話,那麼就有一個NuGet包,它允許你在a中編寫Razor語法。js文件它可以在這裏找到http://nuget.org/packages/RazorJS

1

相反,做這樣的事情在您的視圖頁面:

var options = { 
    parameter1 : '@(SomeC#Value)', 
    parameter2 : '@(SomeC#Value)', 
    parameter3 : '@(SomeC#Value)', 
} 

然後調用類似:

myJavascriptObject.init(options); 

,並有JavaScript中使用傳入的選項控制流量等。

0

我們將C#對象轉換爲Json,並在對象和JavaScriptSerializer上使用擴展:

public static string ToJson(this object item) 
    { 
     return new JavaScriptSerializer().Serialize(item); 
    } 

然後我們送把它放在一個變量(或在我們的情況下,它傳遞給JavaScript的控制器的構造函數)