访问javascript文件中的Model属性?

Blu*_*ppy 16 javascript c# model razor asp.net-mvc-3

是否可以访问外部Javascript文件中的Model属性?

例如,在"somescript.js"文件中

var currency = '@Model.Currency';
alert(currency);
Run Code Online (Sandbox Code Playgroud)

在我的观点

<script src="../../Scripts/somescript.js" type="text/javascript">
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用,但是如果我将javascript直接放入脚本标签内的视图中,那么它确实有效吗?这意味着必须始终将代码放在页面中,而不是像下面这样加载外部脚本文件:

@model MyModel;

<script lang=, type=>
var currency = '@Model.Currency';
alert(currency);
</script>
Run Code Online (Sandbox Code Playgroud)

有没有办法解决?

ars*_*in3 11

我使用数据属性和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>
}
Run Code Online (Sandbox Code Playgroud)

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
});
Run Code Online (Sandbox Code Playgroud)

_Layout.cshtml(可选,但好习惯):

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

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


Ofe*_*lig 9

无法在JS文件中实现MVC/Razor代码.

您应该在HTML中设置变量数据(在.cshtml文件中),这在概念上是正常的并且不违反关注点的分离(服务器生成的HTML与客户端脚本代码),因为如果您考虑它,这些变量值是服务器问题.

看看这个(部分但很好的)解决方法:在MVC框架中的Javascript文件中使用Inline C#