外部化脚本时如何在javascript中生成正确的URL

时间:2012-02-13 18:51:46

标签: javascript asp.net-mvc-3

我正在开发一个ASP.NET MVC3应用程序。我正在阅读有关各个地方的良好Javascript实践,并认为最好是将外部化的javascript和jQuery调用放在< script />中。标记在我的视图底部。

我将每个视图的Javascript放在一个带有标准化命名约定的单独文件中,这样我就可以生成< script />标记以在布局视图中包含相应的文件。

但是它太复杂而无法维护,我遇到了一个破坏整个方案的问题,即需要偶尔将URL插入到javascript中。

例如:如果我正在进行$ .getJSON调用,我需要提供一个URL。我一直在服务器端,在视图中使用UrlHelper类生成它们,如下所示:

var _RegistrationSelectClassUrl = '@Url.Action("SelectClass", "Student", new { area = "Registration", id = Model.Person.PersonID })';

这很好用......直到我将javascript外化了。不再是视图的一部分,对UrlHelper的调用再次只是字符串。

所以我的问题是:如果我坚持使用外部化的javascript,我需要一种方法来插入或生成适当的URL。除了在布局文件中粘贴一个脚本部分,使用UrlHelper为我可能想要使用的每个URL定义一个常量,我想不出一个好的。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

外部JS:

var namespace = {
    init: function (url) {
        this._RegistrationSelectClassUrl  = url;
    },
    _RegistrationSelectClassUrl: ''
};

查看:

<script src="external/js.js" />
<script>
    namespace.init('@Url.Action("SelectClass", "Student", new { area = "Registration", id = Model.Person.PersonID })');
</script>  

这是一个基本的例子。

答案 1 :(得分:1)

你做不到。当脚本离开已解析的页面时,它将失去对模型的所有访问权。如果您将此代码添加到PartialView中,您将能够使用Helper类解析事物,但由于您的链接依赖于模型,因此必须在页面本身中生成脚本。

外化它的方法可能是拥有一个由模型视图本身填充的映射链接数组。然后,您可以根据加载后外部脚本可访问的某个键将链接文本添加到此数组映射中。我建议不要使用全局变量,并为此目的原型化一个对象。

有关此文档的一些文档:http://www.javascripttoolbox.com/bestpractices/#namespace