c# - 在不重复包含指令的情况下向 ASP.NET Web 控件 (ascx) 添加样式和脚本

标签 c# javascript asp.net stylesheet web-controls

考虑开发 Web 控件 (ASP.NET)。你真正想做的是以一种很好的方式设计和开发这个控件,这是一个很好的方法(这就是我想做的,在这个问题中我将进一步解释为什么我不能这样做) .

程序化方法

1) 我在名为 WebControls 的单独文件夹中创建我的控件,并将其命名为(例如)MyWebControl。我将拥有这些文件:MyWebControl.ascxMyWebControl.ascx.cs

2) 鉴于我的控件是一个复杂的控件,我关联了一个样式和一个动态客户端行为引用,在控件 html 中,一个名为 MyWebControl.ascx.css 的 css 样式表和一个名为MyWebControl.ascx.js.

3) 在我的控制下,我做了以下事情:

<%@ Control Language="C#" 
            AutoEventWireup="true" 
            CodeFile="MyWebControl.ascx.cs" 
            Inherits="MyApp.WebControls.MyWebControl" %>

<link href="MyWebControl.ascx.css" rel="stylesheet" type="text/css" />
<script src="MyWebControl.ascx.js" type="text/javascript"></script>

<div>
...
</div>

就是它了!

问题

这个东西有一个问题:当我的控件被呈现时,并且在一个页面中有不止一个我的这个控件,我得到了 css 和 js 文件的链接重复甚至重复了不止一次.

如何在我的控件中链接外部样式表/javascript 文件而不发生这种坏事?

编辑

好吧,在社区中其他人的帮助下,我看了一点之后,我明白了 Page.ClientScript 是来救援的。

但是,要注册的脚本有很多功能......你能说出它们之间的区别吗?

1) Page.ClientScript.IsClientScriptBlockRegistered

2) Page.ClientScript.IsClientScriptIncludeRegistered

3) Page.ClientScript.IsOnSubmitStatementRegistered

4) Page.ClientScript.IsStartupScriptRegistered

以及对应的set方法?

1) Page.ClientScript.RegisterClientScriptBlock

2) Page.ClientScript.RegisterClientScriptInclude

3) Page.ClientScript.RegisterOnSubmitStatement

4) Page.ClientScript.RegisterStartupScript

此外:这也适用于 javascript 和 css 吗?

谢谢

最佳答案

一个想法:难道不能使用ClientScriptManager.RegisterClientScriptBlock吗?注入(inject) css 文件导入?

类似(未测试):

if(! Page.ClientScript.IsClientScriptBlockRegistered("MyWebControl.ascx.css"))
{
    Page.ClientScript.RegisterClientScriptBlock(this.getType(),"MyWebControl.ascx.css",@"<style type=""text/css"" src=""MyWebControl.ascx.css""></style>");
}

编辑以将 RegisterStartupScript 更改为 RegisterClientScriptBlock

根据您的修改:

  • RegisterStartupScript(类型、 key 、脚本)
  • RegisterClientScriptBlock(类型、 key 、脚本)

这两种方法之间的区别在于每个方法发出脚本 block 的位置。 RegisterClientScriptBlock() 在 Web 表单的开头(紧跟在标记之后)发出脚本 block ,而 RegisterStartupScript() 在 Web 表单的末尾发出脚本 block (就在标签之前)。

为了更好地理解为什么有两种不同的方法来发出客户端脚本,请认识到客户端脚本可以分为两类:设计为在加载页面时立即运行的代码,以及设计为在加载页面时立即运行的代码在某些客户端事件发生时运行。设计为在加载页面时运行的代码的一个常见示例是设计用于将焦点设置到文本框的客户端代码。例如,当您访问 Google 时,会在加载页面时执行一小段客户端代码,以自动将焦点设置到搜索文本框。

http://msdn.microsoft.com/en-us/library/aa478975.aspx#aspnet-injectclientsidesc_topic2

编辑:根据您的评论,我假设不幸的是它不能以这种方式工作。查看以下链接:

可能有一些工作方法

作为提示,您可以在 UserControl 的 Page_Init-Handler 中以编程方式创建 HtmlLink:

Dim objLink As New HtmlLink();
objLink.ID = "MyWebControlascxcss";
objLink.Attributes("rel") = "stylesheet";
objLink.Attributes("type") = "text/css";
objLink.Href ="~/filname.css";
Page.Header.Controls.Add(objLink);

如果链接已添加到 Page.Header.Controls-Collection,您应该记得首先使用递归函数进行检查。

关于c# - 在不重复包含指令的情况下向 ASP.NET Web 控件 (ascx) 添加样式和脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6378303/

相关文章:

c# - C#中线程安全的可破坏事件触发类

c# - .Net Core MVC反序列化

asp.net - MVC 升级后如何修复 Chartimg.axd

c# - 当用户在 asp.net mvc3 中未被授权时重定向到另一个页面

asp.net - ASP.NET 2.0 表单上的两个 UpdatePanel

c# - 在数据库中只存储日期而不是时间部分 C#

c# - Azure Function 中的复杂对象应用设置

javascript - Facebook 登录按钮没有显示在我的博客上

javascript - X 轴上的 Highcharts 系列名称

javascript - sql select中的Nodejs子选择