BLACK JACK

Get busy living, or get busy dying.
posts - 24, comments - 199, trackbacks - 30, articles - 3

导航

公告

在MastPage中引用脚本资源

Posted on 2005-12-16 05:29 J. Lin 阅读(...) 评论(...) 编辑 收藏

我们通常会这样引用脚本资源:

<html>
<head runat="server">
    <script type="text/javascript" src="JS/script_include.js"></script>
</head>
<body>
</body>
.
</html>

当然可以把 <script type="text/javascript" src="JS/script_include.js"></script> 写到页面的任何位置,但是写在head中是非常标准的做法,这样写会有很多好处,比如“可见性”的问题。

好了现在我们有了MasterPage,这个非常好,我们只要在MasterPage里引用一些常用的脚本文件,就不用每个页面去写了。
如果还是像上面那样引用脚本文件:
MasterPage.master
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <script type="text/javascript" src="JS/script_include.js"></script>
</head>
<body>
    
<form id="form1" runat="server">

    </form>
</body>
</html>

问题来了,如果在一个不同目录的页面中(比如:Admin/Default.aspx)使用上面这个MasterPage,
<script type="text/javascript" src="JS/script_include.js"></script>
这段会被原封不动的放到生成的页面中,很显然引用失败了。

我们知道有“~”这个东西非常好,很想用它,是不是可以这样写呢:
<script type="text/javascript" src="~/JS/script_include.js"></script>
当然不行,只有runat=server的control“~”,像上面这样写只会原封不动把~/JS/script_include.js输出到客户端。是不是要改成这样:
src="<%= Request.ApplicationPath %>/JS/script_include.js">
这样编译都通不过,看到上面那个<head runat="server"> 没?你还不能把哪个runat="server"去了,MasterPage、Theme全靠它。没办法只能从head里搬出来

<head runat="server">
</head>
<script type="text/javascript" src="<%Request.ApplicationPath %>/JS/script_include.js"></script>
<body>
    
<form id="form1" runat="server">
.......

现在这样是能用了,但是有两个问题。首先,引用没有放在head里;其次,如果你把程序放在根目录下的话,就会变成//JS/script_include.js。That's too bad, and ugly.

Atlas 给我们提供了一种优雅的解决方法。We can use it like that:

<head runat="server"> 
    
<atlas:Script ID="Script1" runat="server" Path="~/JS/script_include.js" />
</head>

上面的那个atlas:Script 是runat=server的,所以可以放心的使用"~",而且引用也待在head里了。当然首先要把你的程序配置成可以使用Atlas,具体方法可以参考atlas.asp.net上的相关内容。