【问题标题】:In ASP.NET/C#, how do I get data from the database into a CSS stylesheet?在 ASP.NET/C# 中,如何从数据库中获取数据到 CSS 样式表中?
【发布时间】:2020-02-07 21:24:53
【问题描述】:

我在 ASP.NET 中有一个类来从数据库中检索与样式表相关的数据。

免责声明:我知道这样做并不是最佳选择,但这是我老师想要的。

我需要创建一个网站,除标签外的所有内容(文本、背景图像等)都直接来自数据库。我的问题是:我无法获取我的数据并将其直接插入到我的 CSS 样式表中。

我正在转身这样的事情:

C#代码

SqlCommand body_bg = new SqlCommand("Select * from image_back where placement='body';", conn);
conn.Open();

SqlDataReader reader = body_bg.ExecuteReader();

while (reader) 
    bod_back = reader["nom"].ToString();

HTML 标记

<body runat="server" style="background-image:url(<%bod_back%>);">

注意: 如果直接在 CSS 样式表中会更好。我已经尝试过了,但是没有成功。

数据库列

  • placement = BODY(我放图片的地方;例如,在本例中为身体背景)
  • nom = /images/bodyback.jpg

有什么方法可以实现吗?

【问题讨论】:

  • 我不明白为什么第一句话在问题中,而提到的课程不是。关联?你在说什么课?
  • 欢迎来到 Stack Overflow。实际上没有理由不能使用 ASP.NET 动态生成 CSS 文件。除非您依赖于一些更自以为是的服务器控件,否则 ASP.NET 并不真正关心您输出的是 HTML、CSS、JavaScript 还是二进制文件(如 PNG)。因此,假设这是 ASP.NET Web 表单(看起来是这样),您可能会调用例如&lt;link rel="stylesheet" href="styles.css.aspx"&gt;。事实上,为了满足挑剔的浏览器,您甚至可以在 .aspx 类型中设置 MIME 类型,例如Response.ContentType = "text/css".
  • 也就是说,如果您的样式特定于每个页面,并且/或者每个请求都在更改,那么通过 &lt;style /&gt; 元素嵌入您的样式可能更有意义。或者,如果您的样式 在整个站点(或至少多个页面)共享,那么您可能希望将某种级别的输出缓存应用于您的例如styles.css.aspx 页面,这样它就不需要每次请求都从数据库中提取数据。当然,我假设您的 CSS 不会经常更改。
  • 另外,Sebastien,你目前的方法有什么不适合的?你遇到什么问题?有错误信息吗?什么都没有被退回?是否输出了错误的数据?
  • 您的标记中有错字,应该是:&lt;body runat="server" style="background-image:url(&lt;%=bod_back%&gt;);"&gt;

标签: c# asp.net database webforms


【解决方案1】:

根据您的代码,我假设您使用的是 ASP.NET Web 窗体框架。如 cmets 中所述,您没有理由不能创建 .aspx 文件来输出 CSS 样式表。虽然 Web 表单默认输出 HTML(即text/html),但它可用于输出 JavaScript、JSON 甚至是 PNG 等二进制文件。

显然,要创建 CSS 样式表,您不会希望使用任何输出 HTML 的固执己见的服务器控件。而且,为了安全起见,您应该将ContentType 设置为text/css,这样挑剔的浏览器就不会抱怨MIME 类型不匹配。但是,除此之外,这应该看起来就像一个普通的 Web 表单页面。

鉴于此,您的代码可能如下所示:

免责声明:这将是伪代码,因为我没有准备好在其中进行测试的环境,而且我已经多年没有编写 ASP.NET Web 窗体代码了。 p>

styles.css.aspx.cs

Response.ContentType = "text/css";

var backgroundRecords = new SqlCommand("select * from image_back;", conn);
var backgroundImages = new Dictionary<string, string>();

conn.Open();

var reader = backgroundRecords.ExecuteReader();

while (reader) {
  backgroundImages.Add(
    reader["placement"].ToString(), 
    reader["nom"].ToString()
  );
}

BackgroundStyles.DataSource = backgroundImages;
BackgroundStyles.DataBind();

styles.css.aspx

<asp:Repeater id="BackgroundStyles" runat="server">
  <ItemTemplate>
    <%# Eval("Key") %> {
      background-image: url('<%# Eval("Value") %>');
    }
  </ItemTemplate>
</asp:Repeater>  

调用页面

<link rel="stylesheet" href="styles.css.aspx">

注意事项

  • 这不包括必要的脚手架,例如@Page 指令或Page_Load 事件
  • 这将查询概括为适用于多个背景,因此您不需要针对每个元素进行查询
  • 假设每种元素类型只有一个背景(例如body
  • 这也将支持使用 CSS 类名的 placement(例如,.header

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2011-12-27
    • 2018-02-03
    相关资源
    最近更新 更多