2011-10-02 98 views
13

是否可以在外部Javascript文件中訪問Model屬性?訪問JavaScript文件中的Model屬性?

例如在「somescript.js」文件

var currency = '@Model.Currency'; 
alert(currency); 

在我查看

<script src="../../Scripts/somescript.js" type="text/javascript"> 

這似乎並沒有工作,但是如果我把的JavaScript直接進入腳本標籤中的觀點,然後它的工作?這意味着必須將代碼放在網頁的所有時間,而不是加載外部腳本文件是這樣的:

@model MyModel; 

<script lang=, type=> 
var currency = '@Model.Currency'; 
alert(currency); 
</script> 

有沒有解決這個辦法嗎?

+0

如果你能產生外部JS文件,然後他們的瀏覽器將緩存動態生成視圖模型的數據。可能不是你想要的? – BritishDeveloper

+1

我最近在博客上介紹瞭如何使用部分Razor視圖生成外部JavaScript文件[blogpost]。博客文章展示瞭如何使用自定義操作過濾器來解析外部JavaScript文件中的Razor代碼。 ** tl; dr:**是的,可以使用簡單但巧妙的解決方法。 [blogpost]:http://blog.mariusschulz.com/generating-external-javascript-files-using-partial-razor-views –

+0

http://stackoverflow.com/a/41312348/2592042我已經在這裏詳細解釋。 –

回答

9

沒有辦法在JS文件中實現MVC/Razor代碼。

您應該在HTML(在.cshtml文件中)設置可變數據,這在概念上是可以的,並且不會違反關注點(服務器生成的HTML與客戶端腳本代碼)的分離問題,因爲如果您仔細考慮,這些變量值是服務器關心的問題。

看看這個(部分,但很好)解決方法:Using Inline C# inside Javascript File in MVC Framework

+1

這是一個很好的解決方案。我可以將所有「靜態」javascript保存在一個文件中,然後將「vars」部分放入部分視圖中並加載該部分視圖。尼斯:) – BlueChippy

2

你可以做的是通過剃刀標籤作爲變量。

在剃刀文件>

var currency = '@Model.Currency'; 
doAlert(currency); 
在JS文件

>

function doAlert(curr){ 
    alert(curr); 
} 
0

你總是可以嘗試RazorJs。這是不能夠使用模型在js文件RazorJs

1

嘗試JavaScriptModel幾乎解決了(http://jsm.codeplex.com):

只是將下面的代碼添加到您的控制器動作:

this.AddJavaScriptVariable("Currency", Currency); 

現在你可以在JavaScript中訪問變量「貨幣」。

如果這個變量應該在孔位上可用,把它放在過濾器中。在文檔中可以找到如何使用過濾器中的JavaScriptModel的示例。

9

我使用數據屬性和jQuery解決了這個問題。它使得代碼非常易讀,並且不需要部分視圖或通過ViewEngine運行靜態JavaScript。 JavaScript文件完全是靜態的,並且會正常緩存。

Index.cshtml:

@model Namespace.ViewModels.HomeIndexViewModel 
<h2> 
    Index 
</h2> 

@section scripts 
{ 
    <script id="Index.js" src="~/Path/To/Index.js" 
     data-action-url="@Url.Action("GridData")" 
     data-relative-url="@Url.Content("~/Content/Images/background.png")" 
     data-sort-by="@Model.SortBy 
     data-sort-order="@Model.SortOrder 
     data-page="@ViewData["Page"]" 
     data-rows="@ViewData["Rows"]"></script> 
} 

Index.js:

jQuery(document).ready(function ($) { 
    // import all the variables from the model 
    var $vars = $('#Index\\.js').data(); 

    alert($vars.page); 
    alert($vars.actionUrl); // Note: hyphenated names become camelCased 
}); 

_layout。CSHTML(可選的,但好習慣):

<body> 
    <!-- html content here. scripts go to bottom of body --> 

    @Scripts.Render("~/bundles/js") 
    @RenderSection("scripts", required: false) 
</body>