ASP.NET MVC 关于MasterPage中<script>标签的文件路径自动解析

      在学习MVC的过程中,发现由于System.Web.Routing.页面的url和实际的站点目录路径可能不再一致。导致了一些标签的src属性(或href属性)无法指向(链接)到正确的文件。
      主要遇到的问题是MasterPage中Head节点下的Script节点的src属性。外联CSS文件的Link节点的href属性能根据客户端的实际访问URL自动解析和调整,从而加载正确的CSS文件。而js文件的加载缺无法自动解析和调整。从而在一些URL目录深度比实际页面文件目录更大的情况下,无法正确加载JS文件。

      查阅了一些资料,尝试使用<%= Url.Content(path)%>方式为Script的src属性赋值,但发现在head节点runat="server"的前提下,该方法无法使用。
      博客园中ASP.NET MVC 中 Master Page 引用脚本错误 这篇文章也提出了比较好的解决方案。即将<script>标签添加到<head>节点下的ContentPlaceHolder(id="head") 中:

       

1 <asp:ContentPlaceHolder ID="head" runat="server">

 

2     <script type="text/javascript"  src="<%= Url.Content("~/Scripts/jquery-1.2.6.js")%>" ></script>
3 </asp:ContentPlaceHolder>
4     

      该方法在ContentPage中无ContentPlaceHolderID="head"的Content节点情况下能解决这个问题,但无法满足某些ContentPage需要使用该节点来给MasterPage的Head节点添加内容的需求。
      权衡之后采用了将MasterPage中Head节点的runat="server"属性删除,并使用<%= Url.Content(path)%>;方式为Script的src属性赋值的方法。
      去掉runat="server“属性后,Link节点的href自动解析功能随之丧失,同样使用Url.Content对其赋值,从而解决了这个问题。

      

1 <head >

 

2     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
3     <asp:ContentPlaceHolder ID="head" runat="server">
4     </asp:ContentPlaceHolder>
5     <link href="<%=Url.Content("~/Content/Site.css") %>" rel="stylesheet" type="text/css" />
6     <script type="text/javascript"  src="<%= Url.Content("~/Scripts/jquery-1.2.6.js")%>" ></script>
7         <script type="text/javascript" src="<%= Url.Content("~/Scripts/JqueryPlugIn/jquery.nyroModal-1.5.0.js")%>"></script>
8   
9 </head>

      该问题的解决遗留了几点问题:
      1.Url.Content方法对src等属性赋值失去了设计器支持,需要对文件的相对路径十分熟悉; 
      2.Head节点失去了runat="server"属性,则服务器端无法修改Head中的内容。这种情况主要指一些ASP.NET的操作,MVC中暂时没有遇到这样的情况。

posted @ 2009-07-15 15:05  Jason Go  阅读(1425)  评论(0编辑  收藏  举报