【问题标题】:Run code in CSS file in ASP.net在 ASP.net 中的 CSS 文件中运行代码
【发布时间】:2012-08-18 21:03:10
【问题描述】:

在我的 CSS 文件中,我希望有如下定义:

.hr {
    background:url('<%=CommonFunctions.AllocateStaticPath("/images/hr.png") %>');
    width: 100%;
    height: 2px;
    margin: 40px 0;
}

这对我很有用,因为每个图像的路径在生产服务器和开发服务器上都不同,并且该函数正确设置了资源路径。能够做到这一点将简化我的发布过程。

如何启用 IIS7 在 CSS 文件上运行 ASP.net?我尝试将 CSS 文件重命名为 .ashx 并创建重写规则,但这似乎总是 404。

【问题讨论】:

标签: asp.net css iis iis-7 server-side


【解决方案1】:

试试这个:

background:url('<%= CommonFunctions.AllocateStaticPath("/images/hr.png") %>');

【讨论】:

  • 抱歉打错了!问题是我需要 CSS 文件来实际运行该代码。
【解决方案2】:

您不能只创建一个返回 CSS 而不是 HTML 的 ASPX 页面吗?然后在您的 CSS 声明中引用 .aspx 文件。

【讨论】:

  • 我可以做到这一点并且它可以工作,但是将 aspx 文件链接为 css 文件感觉有点错误。不确定浏览器是否会以不同的方式缓存它等等。
  • 只需使用Response.Cache.SetExpires 并手动控制缓存。浏览器不关心文件扩展名,只关心 HTTP 标头。
【解决方案3】:

我认为你可以使用 ashx 处理程序 一个页面并添加响应头:

Content-Type: text/css

【讨论】:

    【解决方案4】:

    这个问题启发了我做一些测试,看看我是否可以让请求的语法起作用。

    结果证明是相对容易的。在几个不同的测试版本之后,这就是我最终要做的。

    配置

    1. 创建一个全新的 Web 应用程序进行测试
    2. 创建一个名为DynCss 的文件夹,其中将放置需要动态处理的css文件
    3. 注册.css 文件以由页面处理程序处理,以处理对该文件夹的请求。为此,我在web.config 中添加了以下内容:

      <configuration>
         <system.web>
              ...
              <httpHandlers>
                  <add type="System.Web.UI.PageHandlerFactory" path="/DynCss/*.css" verb="GET"/>
              </httpHandlers>
              ...
          </system.web>
      </configuration>
      
    4. .css 文件注册一个构建处理程序:

      <configuration>
         <system.web>
              ...
              <compilation debug="true" targetFramework="4.0">
                  <buildProviders>
                      <add extension=".css" type="System.Web.Compilation.PageBuildProvider" />
                  </buildProviders>
              </compilation>
              ...
          </system.web>
      </configuration>
      

    完成这些更改后,我可以继续对其进行测试。

    测试

    出于测试目的,我将DynamicStyles.css 添加到DynCss 文件夹中。 DynamicStyles.css的内容:

    <%@ Page Title="DynamicStyles.css" Language="C#" AutoEventWireup="true" %>
    <script runat="server">
        protected void Page_Load(object sender, EventArgs e) 
        {
              Response.ContentType="text/css";
              Response.Cache.SetCacheability(HttpCacheability.Public);
        }
    </script>
    body {
        font-weight: <%= TestDynamicCss.Code.Constants.FontWeight %>;
    }
    

    注意TestDynamicCss.Code.Constants.FontWeight 指的是静态类的静态属性。我只是返回字符串“bold”。

    最后,我在Default.aspx链接到它:

    <%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
        CodeBehind="Default.aspx.cs" Inherits="TestDynamicCss._Default" %>
    
    <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
        <link href="/DynCss/DynamicStyles.css" rel="Stylesheet" type="text/css" />
    </asp:Content>
    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
        <h2>
            Welcome to ASP.NET! Is this now bold? Why yes, it is!
        </h2>
    </asp:Content>
    

    评论

    使用这种方法,您可以获得您要求的行为。缺点是您不会像处理静态 css 文件那样获得任何自动缓存处理。此外,这种方法(据我所知)无法使用 Asp.Net 4.5 的 Css 捆绑功能。另外(不用说)在 Css 文件中 编码 时,您不会获得 C# 智能感知。

    【讨论】:

      猜你喜欢
      • 2022-06-17
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 2018-04-30
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多