将样式和脚本添加到ASP.NET web控件(ascx),而不重复包含指令

Adding styles and scripts to ASP.NET web controls (ascx) without repeating inclusion directives

本文关键字:ascx 指令 包含 控件 脚本 样式 添加 web NET ASP      更新时间:2023-09-26

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

方案方法

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

2) 考虑到我的控件是一个复杂的控件,我将一个样式和一个动态客户端行为关联起来,在控件html中引用一个名为MyWebControl.ascx.css的css样式表和一个称为MyWebControl.ascx.js的javascript文件。

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

以及相应的设置方法?

1) Page.ClientScript.RegisterClientScriptBlock

2) Page.ClientScript.RegisterClientScriptInclude

3) Page.ClientScript.RegisterOnSubmitStatement

4) Page.ClientScript.RegisterStartupScript

此外:这也可以应用于javascript和css吗?

感谢

有一个想法:难道不可能使用ClientScriptManager吗。RegisterClientScriptBlock注入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(类型、键、脚本)
  • RegisterClientScriptBlock(类型、键、脚本)

这两种方法的区别在于每种方法都在哪里发出脚本块。RegisterClientScriptBlock()在Web表单的开头(正好在标记之后)发出脚本块,而RegisterStartupScript()在Web表单结尾(正好在标签之前)发出脚本框。

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

http://msdn.microsoft.com/en-us/library/aa478975.aspx#aspnet-注入客户端_主题2

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

  • http://forums.asp.net/t/557140.aspx/1?CSS+stylesheet+in+ascx+file/?邮政编码=2692177
  • http://nathanaeljones.com/146/referencing-stylesheets-scripts-from-content-pages/

可能有一些工作方法

作为提示,您可以在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-集合,您应该记得首先使用递归函数进行检查。