在.css文件中引用app相对虚拟路径

时间:2008-09-18 02:17:06

标签: asp.net css background-image dynamic-css

假设我的应用程序根目录下有一个“images”文件夹目录。如何在.css文件中使用ASP.NET应用程序相对路径引用此目录中的图像。

示例:

在开发过程中,〜/ Images / Test.gif 的路径可能会解析为 /MyApp/Images/Test.gif ,而在生产中,它可能会解析到 /Images/Test.gif (取决于应用程序的虚拟目录)。显然,我希望避免在环境之间修改.css文件。

我知道你可以使用Page.ResolveClientUrl在渲染时动态地将一个url注入到控件的Style集合中。我想避免这样做。

8 个答案:

答案 0 :(得分:11)

不幸的是,Firefox在这里有一个愚蠢的错误......路径是相对于页面的路径,而不是相对于CSS文件的位置。这意味着如果页面中的页面位于不同的位置(如根目录中的Default.aspx和View文件夹中的Information.aspx),则无法使用相对路径。 (IE将正确解决相对于CSS文件位置的路径。)

我唯一能找到的是关于http://www.west-wind.com/weblog/posts/269.aspx的评论,但说实话,我还没有设法让它发挥作用。如果我这样做,我将编辑此评论:

  

re:理解ASP.Net路径   Russ Brooks 2006年2月25日@ 8:43   是

     

没有人完全回答布兰特的问题   关于CSS内的图像路径   文件本身。我有答案。该   问题是,“我们如何使用   应用程序相对图像路径   在CSS文件中?“我一直都是   这个问题也很沮丧,   所以我只花了最后3个小时   制定解决方案。

     

解决方案是运行CSS文件   然后通过ASPX页面处理程序   使用一小部分服务器端代码   输出根的每个路径   申请路径。准备好了吗?

     
      
  1. 添加到web.config:
  2.   
 <compilation debug="true">
 <!-- Run CSS files through the ASPX handler so we can write code in them. -->
 <buildProviders>
 <add extension=".css" type="System.Web.Compilation.PageBuildProvider" />
 </buildProviders>
 </compilation>

 <httpHandlers>
 <add path="*.css" verb="GET" type="System.Web.UI.PageHandlerFactory" validate="true" />
 </httpHandlers>
  
      
  1. 在CSS中,使用Request.ApplicationPath属性   路径存在的地方,如:

         

    #content {   background:url(&lt;%= Request.ApplicationPath   %&gt; /images/bg_content.gif)repeat-y;   }

  2.   
  3. .NET默认提供MIME类型为“text / html”的ASPX页面,   因此,您的新服务器端CSS   这个页面是用这个MIME提供的   导致非IE浏览器的类型   没有正确读取CSS文件。我们   需要重写这个   “文/ CSS”。只需将此行添加为   CSS文件的第一行:

    <%@ ContentType="text/css" %>
    
  4.   

答案 1 :(得分:8)

如果你不知道你可以这样做......

如果你给CSS中一个资源的相对路径它相对于CSS文件,而不是包含CSS的文件。

background-image: url(../images/test.gif);

所以这可能适合你。

答案 2 :(得分:6)

让您的生活更轻松,只需将CSS中使用的图片放在/css/文件夹旁边/css/style.css。然后,当您引用图像时,请使用相对路径(例如url(images/image.jpg))。

我仍然会将<img>显示的图片保存在/images/文件夹中。例如照片是内容,它们不是网站皮肤/主题的一部分。因此,它们不属于/css/文件夹。

答案 3 :(得分:3)

Marcel Popescu的解决方案是在css文件中使用Request.ApplicationPath。

永远不要使用Request.ApplicationPath - 它是邪恶的!根据路径返回不同的结果!

请改用以下内容。

background-image: url(<%= Page.ResolveUrl("~/images/bg_content.gif") %>);

答案 4 :(得分:3)

将动态CSS放在.ascx文件中的用户控件中,然后您不需要通过asp.net页面处理器运行所有css文件。

<%@ Control %>
<style type="text/css>
div.content
{
background-image:(url(<%= Page.ResolveUrl("~/images/image.png") %>);
}
</style>

但解决~问题的最简单方法是根本不使用~。在Visual Studio中,在解决方案资源管理器中,右键单击您的应用程序,选择“属性窗口”并将虚拟路径更改为/

答案 5 :(得分:1)

在Windows 7上,IIS 7.5:

您不仅需要执行Marcel Popescu提到的步骤。

您还需要在IIS 7.5处理程序映射中添加处理程序映射。因此IIS知道* .css必须与System.Web.UI.PageHandlerFactory一起使用

仅仅在web.config文件中设置内容是不够的。

答案 6 :(得分:-3)

在.css文件中,您可以使用相对路径;所以在你的例子中,假设你将你的css文件放在〜/ Styles / mystyles.css中。您可以使用url(../ Images / Test.gif)作为示例。

答案 7 :(得分:-4)

我在为内容容器显示背景图片时遇到了困难,并尝试了许多类似于此处发布的其他解决方案。我在CSS文件中设置了相对路径,将其设置为aspx页面上的样式我想要显示背景 - 没有任何效果。我尝试了Marcel Popescu的解决方案但它仍然没有用。

在Marcel的解决方案和反复试验相结合后,我最终确定了它的工作。我将代码插入到web.config中,将text / css行插入到我的CSS文件中,但我完全删除了CSS文件中的background属性,并将其设置为aspx页面中内容容器上的样式我希望背景为显示。

这确实意味着对于我想要显示背景的每个或任何其他页面,我将需要设置样式背景属性,但它可以很好地工作。