不显眼的 JavaScript - 未找到单独的 JS 文件

Unobtrusive JavaScript - Separate JS File Not Found

提问人:Bob Horn 提问时间:2/27/2013 最后编辑:CommunityBob Horn 更新时间:2/27/2013 访问量:1991

问:

使用不显眼的 JavaScript 这个概念,我第一次尝试将我的 JavaScript 放在一个独立于 HTML 的文件中。但是,无论我做什么,我都会收到一个错误,即找不到该文件。

这是谷歌浏览器控制台(ctrl-shift-j)中的实际错误:

GET http://localhost:14385/Home/TestPage.js 404 (Not Found)

我从一个新的 MVC 4 应用程序开始。我创建了一个新的测试页面:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <script src="TestPage.js"></script>
    <title></title>
</head>
<body>
    <div>
        <input id="foo" value="snuh" />
    </div>
</body>
</html>

我在同一文件夹中创建了一个新的 TestPage.js:

$(document).ready(function() {

    function dosomething() {
        alert('snuh');
    }

    document.getElementById('foo').onclick = dosomething;
});

我已经尝试了此处发布的提示,但我总是收到找不到 JavaScript 文件的错误。知道这个简单的测试有什么问题吗?

注意:TestPage 实际显示,并显示输入框。

这是解决方案资源管理器中的布局:This is the layout in solution explorer:

enter image description here

javascript asp.net asp.net-mvc-4 unobtrusive-javascript

评论

0赞 istos 2/27/2013
你能提供一个链接吗?
0赞 Bob Horn 2/27/2013
到现场?不,它不是公开的。它只是一个测试应用程序。

答:

1赞 Darin Dimitrov 2/27/2013 #1

确保使用服务器端帮助程序从正确的位置引用 javascript:

<script src="<%= Url.Content("~/TestPage.js") %>"></script>

无论您从哪个位置呈现此视图,这都将正确引用 javascript 文件。它显然假设您已将 javascript 文件放在应用程序的根目录中。约定是使用 Scripts 文件夹来实现此目的:

<script src="<%= Url.Content("~/Scripts/TestPage.js") %>"></script>

更新:

现在您已经展示了您的项目结构,您似乎已将文件放在文件夹中。这是行不通的。无法从客户端访问此文件夹。IIS 明确禁止且不提供此功能。你不应该在里面放置任何静态文件。将 javascript 文件夹移动到该文件夹。TestPage.js~/Views~/Scripts

此外,您似乎在文件中使用了jQuery,但您从未引用过它,因此您的脚本将无法正常工作。如果要使用 jQuery,请确保也已添加它:TestPage.js

<script src="<%= Url.Content("~/Scripts/jquery-1.8.2.js") %>"></script>
<script src="<%= Url.Content("~/Scripts/TestPage.js") %>"></script>

或者,如果您不想使用 jQuery,请修复您的脚本,使其不依赖于它:

function dosomething() {
    alert('snuh');
}

window.onload = function() {
    document.getElementById('foo').onclick = dosomething;
};

或者,如果你把脚本放在 DOM 的末尾,你甚至不需要把它们包装在一个文档就绪的处理程序中,因为在这个阶段,DOM 已经准备好了,你可以操作它:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <div>
        <input id="foo" value="snuh" />
    </div>
    <script src="<%= Url.Content("~/Scripts/TestPage.js") %>"></script>
</body>
</html>

然后在脚本中:

function dosomething() {
    alert('snuh');
}
document.getElementById('foo').onclick = dosomething;

评论

0赞 Bob Horn 2/27/2013
我刚刚尝试过并得到无法加载资源:服务器响应状态为 404(未找到)localhost:14385/Home/~/TestPage.js
0赞 Darin Dimitrov 2/27/2013
您似乎正在使用 WebForms 视图引擎。我已经更新了我的答案。您应该使用帮助程序。<%= Url.Content() %>
0赞 Bob Horn 2/27/2013
做到了!谢谢!实际上,我并不是要使用WebForms视图引擎。我会把它变成剃须刀,看看它是否仍然有效。
0赞 Darin Dimitrov 2/27/2013
如果使用 Razor,则可以直接引用脚本,如下所示:.该字符由 Razor WebPages v2(在 MVC 4 中使用 ASP.NET)解释,并自动转换为正确的位置。<script src="~/Scripts/TestPage.js"></script>~/