是否可以访问外部Javascript文件中的Model属性?
e.g。在“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 :(得分: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>
}
<强> 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>
答案 1 :(得分:9)
无法在JS文件中实现MVC / Razor代码。
您应该在HTML中设置变量数据(在.cshtml文件中),这在概念上是正常的并且不违反关注点的分离(服务器生成的HTML与客户端脚本代码),因为如果您考虑它,这些变量值是服务器关注的问题。
看看这个(部分但很好)的解决方法:Using Inline C# inside Javascript File in MVC Framework
答案 2 :(得分:2)
你可以做的是将剃刀标签作为变量传递。
在剃刀文件&gt;
中var currency = '@Model.Currency';
doAlert(currency);
JS文件中的&gt;
function doAlert(curr){
alert(curr);
}
答案 3 :(得分:1)
尝试JavaScriptModel(http://jsm.codeplex.com):
只需将以下代码添加到控制器操作中:
this.AddJavaScriptVariable("Currency", Currency);
现在您可以在JavaScript中访问变量“Currency”。
如果此孔中的变量应该可用,请将其放入过滤器中。可以在文档中找到如何使用过滤器中的JavaScriptModel的示例。
答案 4 :(得分:1)
我所做的是使用方法调用模式创建js对象,然后可以从外部js文件中调用它。由于js使用全局变量,因此我将其封装以确保与其他js库没有冲突。 例: 在视图中
@section scripts{
<script>
var thisPage = {
variableOne: '@Model.One',
someAjaxUrl: function () { return '@Url.Action("ActionName", "ControllerName")'; }
};
</script>
@Scripts.Render("~/Scripts/PathToExternalScriptFile.js")
}
现在在外部页面内部,您可以获取具有受保护范围的数据,以确保它与js中的其他全局变量不冲突。
console.log('VariableOne = ' + thisPage.variableOne);
console.log('Some URL = ' + thisPage.someAjaxUrl());
此外,您可以将其包装在外部文件中的模块内部,甚至使其更具防撞性。 示例:
$(function () {
MyHelperModule.init(thisPage || {});
});
var MyHelperModule = (function () {
var _helperName = 'MyHelperModule';
// default values
var _settings = { debug: false, timeout:10000, intervalRate:60000};
//initialize the module
var _init = function (settings) {
// combine/replace with (thisPage/settings) passed in
_settings = $.extend(_settings, settings);
// will only display if thisPage has a debug var set to true
_write('*** DEBUGGER ENABLED ***');
// do some setup stuff
// Example to set up interval
setInterval(
function () { _someCheck(); }
, _settings.intervalRate
);
return this; // allow for chaining of calls to helper
};
// sends info to console for module
var _write = function (text, always) {
if (always !== undefined && always === true || _settings.debug === true) {
console.log(moment(new Date()).format() + ' ~ ' + _helperName + ': ' + text);
}
};
// makes the request
var _someCheck = function () {
// if needed values are in settings
if (typeof _settings.someAjaxUrl === 'function'
&& _settings.variableOne !== undefined) {
$.ajax({
dataType: 'json'
, url: _settings.someAjaxUrl()
, data: {
varOne: _settings.variableOne
}
, timeout: _settings.timeout
}).done(function (data) {
// do stuff
_write('Done');
}).fail(function (jqxhr, textStatus, error) {
_write('Fail: [' + jqxhr.status + ']', true);
}).always(function () {
_write('Always');
});
} else {// if any of the page settings don't exist
_write('The module settings do not hold all required variables....', true);
}
};
// Public calls
return {
init: _init
};
})();
答案 5 :(得分:0)
你总是可以试试RazorJs。它几乎解决了无法在js文件RazorJs
中使用模型的问题答案 6 :(得分:0)
我遇到了同样的问题,我做到了:
查看。
`var model = @Html.Raw(Json.Encode(Model.myModel));
myFunction(model);`
外部js。
`function myFunction(model){
//do stuff
}`