我有一个.csHtml
带有 javascript 函数的-razor 文件,该函数使用@Url.Content
内部的C# 函数作为 ajax URL。
我想将该函数移动到.js
从我的视图中引用的文件中。
问题是 javascript 不“知道”@
符号并且不解析 C# 代码。
有没有办法.js
用“@”符号从视图中引用文件?
我有一个.csHtml
带有 javascript 函数的-razor 文件,该函数使用@Url.Content
内部的C# 函数作为 ajax URL。
我想将该函数移动到.js
从我的视图中引用的文件中。
问题是 javascript 不“知道”@
符号并且不解析 C# 代码。
有没有办法.js
用“@”符号从视图中引用文件?
您可以使用 HTML5data-*
属性。假设您想在单击某个 DOM 元素(例如 div)时执行某些操作。所以:
<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>
然后在您单独的 javascript 文件中,您可以不显眼地使用 DOM:
$('#foo').click(function() {
var url = $(this).data('url');
// do something with this url
});
通过这种方式,您可以在标记和脚本之间实现纯粹的分离,而无需在 javascript 文件中添加任何服务器端标签。
好吧,我刚刚在 nuget 上找到了一个可以做到这一点的剃须刀引擎!意义解决@
语法!
它的名字是RazorJS。
该的NuGet包
2016更新:
包5年未更新,项目站点链接失效。我不建议人们再使用这个库。
解决问题的一种方法是:
将带有 javascript 函数的局部视图添加到视图中。
这样您就可以使用@
符号,并且您的所有javascript
功能都与视图分离。
您有两个选择:
例如:
var MyCompany =
{
MyProject: {
MyVariable:""
}
};
然后在您看来,设置它:
MyCompany.MyProject.MyVariable = @....
您可能想知道没有任何好处是因为耦合,这是真的,您正在耦合 js 和视图。这就是为什么脚本必须不知道它们正在运行的位置的原因,因此这是文件组织非最佳的症状。
无论如何,还有第三种选择来创建视图引擎并针对剃刀运行 js 文件并将结果发回。这更干净,但速度要慢得多,所以也不推荐。
为了将@
变量放入您的 .js 文件中,您必须使用全局变量并从使用该 .js 文件的 mvc 视图中设置该变量的值。
JavaScript 文件:
var myValue;
function myFunc() {
alert(myValue);
}
MVC 视图文件:
<script language="text/javascript">
myValue = @myValueFromModel;
</script>
只要确保对您的函数的任何调用都发生在视图设置值之后。