有嵌入的JavaScript代碼塊與如何將Razor C#代碼嵌入到.js文件中?
<script type='text/javascript'>
...
</script>
但剃刀代碼將無法在.js
文件編譯,從.cshtml
文件包括在內。
如何使這項工作?或者有沒有其他優雅的方法可以產生類似的效果?
謝謝。
有嵌入的JavaScript代碼塊與如何將Razor C#代碼嵌入到.js文件中?
<script type='text/javascript'>
...
</script>
但剃刀代碼將無法在.js
文件編譯,從.cshtml
文件包括在內。
如何使這項工作?或者有沒有其他優雅的方法可以產生類似的效果?
謝謝。
當我面對這個問題,有時我會提供的.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" />
你不能。你甚至不應該嘗試。保持它們分開。這反過來,但你應該看看Unobtrusive JavaScript。整個項目中應用的設計模式是一個好主意。
我嘗試了Unobtrusive JavaScript,但在某些情況下,我需要更新不同的元素,或者更新一個可能使用jQuery語句$('#bla')。parent()檢索的'parent'元素,根據迴應。我可能沒有深入研究它,但AFAIK它不能滿足我的需要。 – 2012-02-23 10:07:17
也許我可以提供一個有用的解決方法,取決於你想完成什麼。
我很想找到一種方法來評估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文件。
下面是一個示例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>
而關於其中只包含的JS .cshtml什麼?包含
.csthml父
@RenderPage("_scripts.cshtml")
_scripts.cshtml的js
<script type="text/javascript">
alert('@Datetime.ToString()');
</script>
...動態生成的JavaScript人民遭受可怕。由於JavaScript文件是靜態的,因此不會將JavaScript代碼嵌入到JavaScript文件中。 – Raynos 2012-02-23 03:18:33
如果您想解決您嘗試解決的問題的解決方案,您會更好。所以,首先詳細說明問題,然後嘗試解決方案。你目前試圖解決這個問題的方式並不好。 – Paul 2012-02-23 03:28:07
我會試着找到一個更一般的解決方案,否則我需要在這裏問很多次不同的情況。 – 2012-02-23 10:09:24