我正在 ASP.NET 中开发 Web 界面。如果重要的话,我正在使用 XHTML 1.0 Transitional 文档类型。
这个网站有母版页,这就是问题所在。当我在标题中为 CSS 链接使用真正的绝对路径时,一切都很好。但是当我尝试将其切换为波浪符号时,所有的样式都坏了。
这是原始母版页的片段,效果很好:
<head>
<title>Account Information</title>
<link href="/css/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
...
</body>
但后来我们发现这个帐户的东西将成为一个不在服务器根目录上的应用程序,所以我们不得不做出改变。
<head>
<title>Account Information</title>
<link runat="server" href="~/css/main.css" rel="stylesheet" type="text/css" />
</head>
<body>
...
</body>
现在,那些相同的更改(添加 runat="server"和波浪号)在页面的其他任何地方都工作得很好,但这个没有。当我查看输出时,它没有解析波浪号,所以链接实际上指向“myserver.net/~/css/main.css”,这显然是行不通的。
接下来我尝试使用 ResolveURL,如下所示:
<link runat="server" href="<% =ResolveURL("~/css/main.css") %>" rel="stylesheet" type="text/css" />
Visual Studio 甚至不会编译它。它甚至不知道 ResolveURL 是什么意思(作为测试,我在其他几个地方粘贴了相同的代码,包括链接标记旁边的页面标题,它在其他地方都运行良好)。
我最终通过给链接一个 ID 并在代码隐藏中设置 href 来让它工作:
--Master page--
<link id="StyleLink" runat="server" rel="stylesheet" type="text/css" />
--Masterpage codebehind file--
StyleLink.Attributes.Add("href", ResolveUrl("~/css/main.css"));
但我想知道为什么我不得不花两个小时来解决这个问题。为什么标准 ~ 符号首先不起作用?我在谷歌上搜索了一段时间,但找不到任何特别相关的东西;我能找到的最接近的是讨论 ~ 符号在子主页中时失败。
最佳答案
这现在在我面前的母版页中有效:
<head runat="server">
<link runat="server" href="~/styles/main.css" rel="stylesheet" type="text/css" />
</head>
对于应用程序根目录中的页面,这将转换为 HTML 如下:
<link href="styles/main.css" rel="stylesheet" type="text/css" />
对于根目录以外的文件夹中的页面,如下所示:
<link href="../styles/main.css" rel="stylesheet" type="text/css" />
(显然,两个页面都使用那个 Master)
替代方法
将 CSS 文件的路径存储在 Web 配置中,并在部署时更改它。
您甚至可以使用 Web Config Transformations 根据构建类型自动更改它。
关于c# - 为什么 CSS 无法解析母版页上相关链接中的 ~ 符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973196/