2012-02-23 69 views
11

有嵌入的JavaScript代碼塊與如何將Razor C#代碼嵌入到.js文件中?

<script type='text/javascript'> 
    ... 
</script> 

但剃刀代碼將無法在.js文件編譯,從.cshtml文件包括在內。

如何使這項工作?或者有沒有其他優雅的方法可以產生類似的效果?

謝謝。

+1

...動態生成的JavaScript人民遭受可怕。由於JavaScript文件是靜態的,因此不會將JavaScript代碼嵌入到JavaScript文件中。 – Raynos 2012-02-23 03:18:33

+0

如果您想解決您嘗試解決的問題的解決方案,您會更好。所以,首先詳細說明問題,然後嘗試解決方案。你目前試圖解決這個問題的方式並不好。 – Paul 2012-02-23 03:28:07

+0

我會試着找到一個更一般的解決方案,否則我需要在這裏問很多次不同的情況。 – 2012-02-23 10:09:24

回答

18

當我面對這個問題,有時我會提供的.js文件是在.cshtml文件訪問的功能...

// someFile.js 
var myFunction = function(options){ 
    // do stuff with options 
}; 

// razorFile.cshtml 
<script> 
    window.myFunction = new myFunction(@model.Stuff); 
    // If you need a whole model serialized then use... 
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model))); 
</script> 

不一定是最好的選擇,但它會怎麼做,如果你必須這樣做......

你也許可以嘗試用你的HTML元素,如jQuery.validate.unobtrusive如何做數據屬性的另一件事......

//someFile.js 
var options = $("#stuff").data('stuff'); 

// razorFile.cshtml 
<input type="hidden" id="stuff" data-stuff="@model.Stuff" /> 
+0

+1,我也在視圖中設置變量/ js對象。通常這是需要通過ajax訪問的URL的情況。例如'' – RPM1984 2012-02-23 04:16:03

+0

我喜歡他的第二個選項。它有點奇怪,但它有效。 – mdance 2014-04-16 16:40:07

+0

您可以在cshtml視圖中添加一個「section」,並定義一個變量,如:variable = @ Model.Parameter。在您開始定義的js文件中:'var Parameter;'然後您可以訪問這個變量在js文件中只需輸入Parameter就可以了。 – Levimatt 2016-09-23 09:22:43

4

你不能。你甚至不應該嘗試。保持它們分開。這反過來,但你應該看看Unobtrusive JavaScript。整個項目中應用的設計模式是一個好主意。

+0

我嘗試了Unobtrusive JavaScript,但在某些情況下,我需要更新不同的元素,或者更新一個可能使用jQuery語句$('#bla')。parent()檢索的'parent'元素,根據迴應。我可能沒有深入研究它,但AFAIK它不能滿足我的需要。 – 2012-02-23 10:07:17

1

雖然我同意你應該考慮在JavaScript文件中使用Razor,有一個Nuget包可以幫助你。它被稱爲RazorJS

該軟件包的作者有一個blog post關於它,這解釋瞭如何使用它。

0

也許我可以提供一個有用的解決方法,取決於你想完成什麼。

我很想找到一種方法來評估java腳本文件中的剃刀表達式。我想附加一個jQuery點擊事件處理程序來提交在許多頁面上找到的特定類。這應該在jQuery文檔就緒事件處理程序中完成。此點擊事件將執行ajax調用。

這些應用程序的url應該是相對的,而不是絕對的,以防應用程序在根級別以下。所以,我想用類似

$(document).ready(function() { 
    $('input[type="submit"].checkit)').click(function (e) { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Content("~/checkit")', //Razor expression here 
      dataType: 'json', 
      success: function (data) { 
       if (!data) { 
        e.preventDefault(); 
        handleResponse(data); 
       } 
      }, 
      data: null, 
      async: false 
     }); 
    }); 
}); 

我通過包裝的代碼的函數Checkit和呼叫移動到佈局視圖解決了這個:

 $(document).ready(function() { 
      Checkit('@Url.Content("~/checkit")'); 
     }); 

大多數的JavaScript代碼仍然在一個JavaScript文件。

3

下面是一個示例Razor網頁(不是MVC視圖,雖然它會類似),它將爲Javascript提供服務。當然,動態編寫Javascript文件是非典型的,但這裏還是一個例子。我曾經使用過這種情況,我希望提供JSON數據和其他一些計算成本昂貴並且很少更改的東西,因此瀏覽器可以將其包含並像緩存JS文件一樣緩存。這裏的訣竅就是設置Response.ContentType,然後爲您的Javascript使用諸如Razor <text>標籤之類的標籤。

@{ 
Response.ContentType = "text/javascript"; 
Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime); 
Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28)); 
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); 
<text> 
var someJavaScriptData = @someSortOfObjectConvertedToJSON; 
function something(whatever){ 
} 
</text> 
} 

然後,您可以將它包括爲使您的其他剃刀文件:

<script src="MyRazorJavascriptFile.cshtml"></script> 
0

而關於其中只包含的JS .cshtml什麼?包含

.csthml父

@RenderPage("_scripts.cshtml") 

_scripts.cshtml的js

<script type="text/javascript"> 
alert('@Datetime.ToString()'); 
</script>