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

时间:2011-06-16 20:39:03

标签: 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的javascript文件。< / p>

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吗?

三江源

1 个答案:

答案 0 :(得分: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>");
}

已修改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);

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