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") 中:
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对其赋值,从而解决了这个问题。
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中暂时没有遇到这样的情况。