ASP.NET自定义控件 – 什么是最好的方式来包括嵌入式CSS引用一次?
|
问题:我将一个CSS文件嵌入一个具有多个控件的自定义控件库中.我想为所有控件共享同一个CSS文件,无论它们在给定的表单上有多少个实例.当表单上有多个控件时,我只想在ASP.NET页面的 HTML头文件中引用CSS文件. 这是我想出来的(到目前为止): Public Sub IncludeStyles(ByVal Page As System.Web.UI.Page)
'Don't include the reference if it already exists...
If Page.Header.FindControl("MyID") Is Nothing Then
Dim cssUrl As String = Page.ClientScript.GetWebResourceUrl(GetType(Common),StylePath)
Dim css As New System.Web.UI.HtmlControls.HtmlGenericControl("link")
With css
.Attributes.Add("rel","stylesheet")
.Attributes.Add("type","text/css")
.Attributes.Add("href",cssUrl)
.ID = "MyID"
End With
Page.Header.Controls.Add(css)
End If
End Sub
好的,它的工作原理…但这里的明显缺陷是使用FindControl()来查看控件是否存在于表单上.虽然我使用命名容器,但仍然似乎正在运行,我相信有一些方法可以打破这个.在表单上添加相同ID的另一个控件肯定是一个… 问题:什么是更好的方法来确保标题控件只添加到HTML标题一次? 注意:ClientScript.RegisterClientScriptResource()方法具有接受.NET类型的参数,并且可以使用此类型来确保每页只输出一次代码.不幸的是,此方法仅适用于JavaScript文件引用.如果CSS引用有内置的等效项,那就是我的偏好. 更新: 我发现通过使用Page.ClientScript.RegisterClientScriptBlock并且告诉它包含你自己的脚本标签来做这个here的稍微优雅的方式,但是如Rick指出的那样,这不会将脚本添加到html头标记中不符合xhtml标准. 更新2: 我在this thread看到另一个有趣的想法,但是循环访问控件集合并不是一个很好的解决方案,如果页面上有几个引用和几个控件,会增加很多开销. Chris Lively想出了一个更好的解决方案,需要更少的代码.这是我的功能改变与新的解决方案: Public Sub IncludeStyles(ByVal Page As System.Web.UI.Page)
If Not Page.ClientScript.IsClientScriptBlockRegistered(StyleName) Then
Dim cssUrl As String = Page.ClientScript.GetWebResourceUrl(GetType(Common),StylePath)
Dim css As New System.Web.UI.HtmlControls.HtmlGenericControl("link")
With css
.Attributes.Add("href",cssUrl)
.Attributes.Add("rel","text/css")
End With
Page.Header.Controls.Add(css)
Page.ClientScript.RegisterClientScriptBlock(GetType(Page),StyleName,"")
End If
End Sub
关于这个解决方案需要注意的几件事情.在他的原始帖子中,Chris使用了IsClientScriptIncludeRegistered()方法,而不是RegisterClientScriptBlock()方法的相应方法.要使此功能正确,测试必须使用IsClientScriptBlockRegistered()完成. 另外,请注意传递给RegisterClientScriptBlock()的类型.我将自定义数据类型传递给此方法(在所有控件中都是相同的),但没有以IsClientScriptBlockRegistered()测试的方式进行注册.为了使其工作,当前的Page对象必须作为Type参数传入. 尽管诚然,这种解决方案感觉有点像黑客,但它不需要很多代码或开销,b)在页面上产生所需的输出,c)是符合xhtml的代码. 解决方法为了在从服务器控件发出css文件时防止重复,我们执行以下操作:if (!Page.ClientScript.IsClientScriptBlockRegistered("SoPro." + id)) {
HtmlLink cssLink = new HtmlLink();
cssLink.Href = cssLink.Href = Page.ClientScript.GetWebResourceUrl(this.GetType(),styleSheet);
cssLink.Attributes.Add("rel","stylesheet");
cssLink.Attributes.Add("type","text/css");
this.Page.Header.Controls.Add(cssLink);
this.Page.ClientScript.RegisterClientScriptBlock(typeof(System.Web.UI.Page),"SoPro." + id,String.Empty);
}
首先,我们测试以查看命名脚本是否以前注册.如果没有,我们添加它. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – System.Web.Cache和HTTPContext.Curent.Cache之
- asp.net-mvc – 给定htmlHelper动作名称,如何找出控制器名称
- .net – SqlBulkCopy超时
- asp.net-mvc – VaryByParam =“*”是否也读取了RouteData.
- asp.net – HttpError iis config在添加默认路径时抛出异常
- .net – 应用程序池限制
- asp.net-mvc-3 – ASP.NET MVC3 Razor:没有@if或@foreach可
- asp.net – ObjectCache的“Set”和“Add”有什么区别?
- asp.net-mvc – 了解nopCommerce的MVC标签
- asp.net – 与web.config中的targetFramework相关的配置错误
- asp.net – CORS错误 – 请求的资源上没有“Acce
- asp.net-mvc – 如何在ASP.NET MVC中执行辅助操作
- asp.net-mvc – 缓存直到ASP.NET MVC和Entity Fr
- iis-6 – 如何防止IIS覆盖我在ASP.NET中设置的文
- asp.net – AcquireRequestState的长时间延迟
- 为什么这么多ASP.NET开发服务器实例?
- 在asp.net网页中尝试WebSecurity.CreateAccount时
- asp.net-mvc – 具有IE条件注释的MVC4捆绑/缩小
- 具有嵌套列表的ASP.NET MVC DefaultModelBinder
- asp.net – 请求标头的大小太长
