BLACK JACK

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

在MastPage中引用脚本资源

Posted on 2005-12-16 05:29 J. Lin 阅读(2365) 评论(8)  编辑 收藏 网摘 所属分类: ASP.NET 2.0

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

<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上的相关内容。

0
0
(请您对文章做出评价)
« 上一篇:Design Templates for ASP.NET 2.0
» 下一篇:VS2005 Add-in:CSS Properties Window

Feedback

这样还需要安装Atlas吗?直接
<script type="text/javascript" src="/JS/script_include.js"></script>
不就行了吗?

#2楼[楼主]   回复  引用  查看    

2005-12-16 11:36 by 出走的影子      
@露雨城市.NET2.0和Sql Server 2005开发研究
如果是你的个人网站当然没问题,如果是Web Application可能被部署在任何目录下,可能是"/"、可能是"/AA"、也可能是"/AA/BB"。ASP程序员和PHP程序员好像不太考虑这个问题

#3楼   回复  引用    

2005-12-21 18:16 by jisuye[未注册用户]
<script type="text/javascript" src="<%= ResolveUrl("~/js/script_include.js") %>"></script>


呵呵

#4楼   回复  引用  查看    

2006-08-28 13:27 by Nina      
在vb中,使用master後,原js就不能用了。不知道是為什麼。

#5楼   回复  引用    

2006-11-06 09:14 by 恩 电[未注册用户]
你可以考虑做个控件来负责引用css呀,例如
using System;
using System.Web;
using System.Web.UI;
using Website.Components;

namespace Website.Controls
{
/// <summary>
/// Encapsulated rendering of style based on the selected skin.
/// </summary>
public class WebsiteStyle : LiteralControl
{
public WebsiteStyle()
{
// Add the style sheet
base.Text = "<link rel=\"stylesheet\" href=\"" + Globals.ApplicationPath + "/Css/" + Globals.Language + "/Default/css.css\" type=\"text/css\" />";
//Globals.ApplicationPath和Globals.Language 在Website.Components中定义
}
}
}

#6楼   回复  引用  查看    

2007-03-25 03:49 by 陈招展      
这个问题困扰我很长时间 、、、、

#7楼   回复  引用    

2007-03-29 13:22 by coollzh[未注册用户]
不一定非要写到header里吧

#8楼   回复  引用    

2007-06-22 09:51 by killuakun[未注册用户]
@jisuye

你的方法比较实用 i like it