2011-10-02 95 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>