C# 母版页CSS链接可以';无法解决~

C# 母版页CSS链接可以';无法解决~,c#,asp.net,master-pages,link-tag,C#,Asp.net,Master Pages,Link Tag,我正在用C#ASP.net开发一个web界面。如果有必要的话,我使用的是XHTML1.0 这个网站有一个主页,这就是问题所在。当我在标题中为CSS链接使用真正的绝对路径时,一切都很好。但是,当我尝试将其切换为平铺符号时,所有的样式都崩溃了 以下是原始母版页的一个片段,它运行良好: <head> <title>Account Information</title> <link href="/css/main.css" rel="styles

我正在用C#ASP.net开发一个web界面。如果有必要的话,我使用的是XHTML1.0

这个网站有一个主页,这就是问题所在。当我在标题中为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”和一个tilde)在页面的其他地方都可以正常工作,但这一个没有。当我查看输出时,它没有解析tilde,因此链接实际上指向“myserver.net/~/css/main.css”,这显然是行不通的

接下来,我尝试使用ResolveURL,如下所示:

<link runat="server" href="<% =ResolveURL("~/css/main.css") %>" rel="stylesheet" type="text/css" />

VisualStudio甚至不会编译这个。它甚至不知道这是什么意思。(作为测试,我在其他几个地方粘贴了相同的代码,包括链接标签旁边的页面标题,其他地方都很好!)

通过给链接一个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"));
——母版页--
--母版页代码隐藏文件--
StyleLink.Attributes.Add(“href”,ResolveUrl(“~/css/main.css”);

但我想知道为什么我要花两个小时来对付这个。为什么标准~符号一开始不起作用?我在谷歌上搜索了一会儿,但找不到任何特别相关的东西;我能找到的最接近的一个例子是在子母版页中讨论~notation失败。

我猜这可能是应用范围的问题。换句话说,当您运行
时,应用程序可能会返回如下内容

http://www.mydirectory.com/includes/masterpages/css/base.css
http://www.mydirectory.com/css/base.css
你想要这样的回报吗

http://www.mydirectory.com/includes/masterpages/css/base.css
http://www.mydirectory.com/css/base.css
由于~获取应用程序根目录并将其追加,如果母版页未保存在根目录中,则可能会在母版页的位置上出错

这里有一个指向一个SO问题的链接,我引用这个问题来解释这个问题。


我不知道除了链接标签中一个可能未闭合的引号之外,为什么它不会编译。例如,
这在我面前的母版页中起作用:

<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" />

(显然,两页都使用该母版)


替代方法

将CSS文件的路径存储在web配置中,并在部署时对其进行更改

您甚至可以使用根据构建类型自动更改它。

我在母版页中使用以下语法链接到CSS文件

 <link  href="~/bm/Styles/Site.css" rel="stylesheet" type="text/css" />

该路径在Chrome和Firefox中正确解析,但在IE9中没有。以下语法在所有三种浏览器中都可以正常工作。注意id和runat条目

<link id="siteCss" runat="server"
      href="~/bm/Styles/Site.css" rel="stylesheet" type="text/css" />


ResolveURL与ResolveURL不同。我必须重新键入它才能将其放入邮件中。它在原始代码中是正确的。波浪符号(~/)不是CSS的标准符号,它是Microsoft/ASP.Net的标准符号。您的浏览器和CSS没有应用程序根的概念。因此,无论是在ASPX还是代码隐藏中,您都需要将其解引用到绝对URL,以便浏览器可以找到它。我不认为我看到生命周期是如何进入这一讨论的。当我把~/放在link标签中时,它不起作用;如果我将相同的~/放在标题标签的旁边,它就可以正常工作。或者页面中的任何其他地方。不管怎样,我使用MVS 2010,以及页面上的任何其他地方,从服务器标签开始(我在回答中说的是,如果子文件夹中有母版页而不是根目录,那么如果使用母版页中的~引用根目录,它将删除所有样式,因为它调用的位置不正确。