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

And*_*dry 13 javascript c# asp.net web-controls stylesheet

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

一种程序化方法

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

2)鉴于我的控件是一个复杂的控件,我将一个样式和一个动态客户端行为引用,在控件html中,调用一个css样式表MyWebControl.ascx.css和一个调用的javascript文件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>
Run Code Online (Sandbox Code Playgroud)

就是这个!

问题

好吧,这个问题有一个问题:当我的控件被渲染,并且在一个页面中有多个这个控件时,我得到了重复的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吗?

谢谢

Tim*_*ter 8

有人想过:使用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>");
}
Run Code Online (Sandbox Code Playgroud)

编辑RegisterStartupScript改为RegisterClientScriptBlock

根据您的编辑:

  • RegisterStartupScript(类型,键,脚本)
  • RegisterClientScriptBlock(类型,键,脚本)

这两种方法的区别在于每个方法都会发出脚本块.RegisterClientScriptBlock()在Web窗体的开头(标签后面)RegisterStartupScript()发出脚本块,同时在Web窗体的末尾(标签前面)发出脚本块.

为了更好地理解为什么有两种不同的方法来发出客户端脚本,请认识到客户端脚本可以分为两类:设计为在加载页面时立即运行的代码,以及设计为在运行时运行的代码.发生了一些客户端事件.设计为在加载页面时运行的代码的常见示例是设计用于将焦点设置为文本框的客户端代码.例如,当您访问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);
Run Code Online (Sandbox Code Playgroud)

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