我有一个.csHtml
带有javascript函数的-razor文件,该文件使用@Url.Content
Ajax URL内部的C#函数。
我想将该函数移动到.js
我的视图引用的文件中。
问题在于javascript无法“知道”该@
符号,也无法解析C#代码。
有没有办法.js
从带有“ @”符号的视图中引用文件?
我有一个.csHtml
带有javascript函数的-razor文件,该文件使用@Url.Content
Ajax URL内部的C#函数。
我想将该函数移动到.js
我的视图引用的文件中。
问题在于javascript无法“知道”该@
符号,也无法解析C#代码。
有没有办法.js
从带有“ @”符号的视图中引用文件?
Answers:
您可以使用HTML5 data-*
属性。假设您想在单击某些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和view。这就是为什么脚本必须忽略它们的运行位置,所以这是文件的非最佳组织的症状。
无论如何,还有第三种选择来创建视图引擎并针对剃刀运行js文件并将结果发送回去。这比较干净,但速度慢得多,因此也不建议使用。
为了将@
变量放入您的.js文件中,您必须使用全局变量并从使用该.js文件的mvc视图中设置该变量的值。
JavaScript文件:
var myValue;
function myFunc() {
alert(myValue);
}
MVC查看文件:
<script language="text/javascript">
myValue = @myValueFromModel;
</script>
只要确保对函数的任何调用都在视图设置了值之后发生。
可能这不是正确的方法。考虑分离关注点。您应该data injector
在JavaScript
课堂上使用,大多数情况下数据是JSON
。
在您的script
文件夹中创建一个JS文件,并将此引用添加到您的View
<script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script>
现在,JavaScript
在您的中考虑一个文字类yourJsFile.js
:
var contentSetter = {
allData: {},
loadData: function (data) {
contentSetter.allData = eval('(' + data + ')');
},
setContentA: function () {
$("#contentA").html(allData.contentAData);
},
setContentB: function () {
$("#contentB").html(allData.contentAData);
}
};
同时声明一个类
public class ContentData
{
public string ContentDataA { get; set }
public string ContentDataB { get; set }
}
现在,从您Action
执行以下操作:
public ActionResult Index() {
var contentData = new ContentData();
contentData.ContentDataA = "Hello";
contentData.ContentDataB = "World";
ViewData.Add("contentData", contentData);
}
从您的角度来看:
<div id="contentA"></div>
<div id="contentB"></div>
<script type="text/javascript">
contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])');
contentSetter.setContentA();
contentSetter.setContentB();
</script>
我最近在博客中发表了有关该主题的文章:使用Partial Razor Views生成外部JavaScript文件。
我的解决方案是使用自定义属性(ExternalJavaScriptFileAttribute
),该属性按原样呈现部分Razor视图,然后返回不带周围<script>
标签的视图。这使其成为有效的外部JavaScript文件。
我认为您不得不在视图中放入该JS代码。据我所知,Razor解析器不会查看.js文件,因此您使用的所有内容均@
无法使用。正如您所发现的那样,PLus,Java脚本本身不喜欢这个@
字符无缘无故地徘徊,例如字符串中。