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)
无法在JS文件中实现MVC/Razor代码.
您应该在HTML中设置变量数据(在.cshtml文件中),这在概念上是正常的并且不违反关注点的分离(服务器生成的HTML与客户端脚本代码),因为如果您考虑它,这些变量值是服务器问题.
看看这个(部分但很好的)解决方法:在MVC框架中的Javascript文件中使用Inline C#