Asp.net中动态在中加入Scrpit标签

许久以前,写过一篇《asp.net页中动态加入样式表文件》,后来发现在使用时如果每页都写这么个函数真是很麻烦,于是自己写了一个Page的派生。将这个函数加了进去。
      /**//// <summary>
    
/// 作者 邹健
    
/// 日期 20070202
    
/// 重载的Page类。
    
/// </summary>
    public class ChPage : Page {
        
/**//// <summary>
        
/// 构造函数。
        
/// </summary>
        public ChPage() { }
        
/**//// <summary>
        
/// Render函数。
        
/// </summary>
        
/// <param name="writer">HtmlTextWriter。</param>
        protected override void Render(HtmlTextWriter writer) {
            
if (writer is System.Web.UI.Html32TextWriter) {
                writer 
= new FormFixerHtml32TextWriter(writer.InnerWriter);
            }
            
else {
                writer 
= new FormFixerHtmlTextWriter(writer.InnerWriter);
            }
            
base.Render(writer);
        }
        
/**//// <summary>
        
/// 设置Html标签内,的Link标签,如Css
        
/// </summary>
        
/// <param name="cssfile">Css文件。</param>
        protected void SetHtmlLink(string cssfile) {
            HtmlLink myHtmlLink 
= new HtmlLink();
            myHtmlLink.Href 
= cssfile;
            myHtmlLink.Attributes.Add(
"rel""stylesheet");
            myHtmlLink.Attributes.Add(
"type""text/css");
            Page.Header.Controls.Add(myHtmlLink);
        }
        
/**//// <summary>
        
/// 该函数可获得web.config中的字符串。
        
/// </summary>
        
/// <param name="Str">指定项的键值。</param>
        
/// <returns>返回键值所指的值。</returns>
        protected string GetString(string Str) {
            
return System.Configuration.ConfigurationManager.AppSettings[Str];
        }
    }

但是后来发现在使用asp.net编程时,如果应用模板页的话,不止是css文件不容易后往里添,javascript文件也是如此,虽然说在模板页的<head />中建一个contentplaceholder也算可以,但那种方法毕竟不太雅,有失风范。于是就想按这种添加<link />标签的方法来泡制<script />
但发现在System.Web.UI.HtmlControls中有HtmlLink来表现<link />但却没有表现<Script />标签的类。
没办法了,因为懒所以只能自己写一个了,代码不长,如下。
namespace Chsword.Class {
    
/// <summary>
    
/// 可以生成script标签
    
/// </summary>
    [ControlBuilder(typeof(HtmlEmptyTagControlBuilder)), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    
public class HtmlScript : HtmlControl {
        
// Methods
        public HtmlScript()
            : 
base("script") {
        }
        
protected override void Render(HtmlTextWriter writer) {
            writer.WriteBeginTag(
this.TagName);
            
this.RenderAttributes(writer);
            writer.Write(">");
            writer.WriteEndTag(TagName);
        }
        
protected override void RenderAttributes(HtmlTextWriter writer) {
            
if (!string.IsNullOrEmpty(this.Src)) {
                
base.Attributes["src"= base.ResolveClientUrl(this.Src);
            }
            
base.Attributes["type"= "text/javascript";
            
base.RenderAttributes(writer);
        }
        
/// <summary>
        
/// 脚本的URL
        
/// </summary>
        [UrlProperty]
        [DefaultValue(
"")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        
public virtual string Src {
            
get {
                
string text = base.Attributes["src"];
                
if (text == null) {
                    
return string.Empty;
                }
                
return text;
            }
            
set {
                
base.Attributes["src"= MapStringAttributeToString(value);
            }
        }
        
string MapStringAttributeToString(string s) {
            
if ((s != null&& (s.Length == 0)) {
                
return null;
            }
            
return s;
        }
    }
}
随后我又在原来重 写的ChPage类中添加了一个函数
        /// <summary>
        
/// 设置script现在只能是type=text/javsscript的
        
/// </summary>
        
/// <param name="src">脚本地址</param>
        protected void SetHtmlScript(string src) {
            HtmlScript myHtmlScript 
= new HtmlScript();
            myHtmlScript.Src 
= src;
            Page.Header.Controls.Add(myHtmlScript);
        }

使用方法

原来的页面脚本是这样的
vb.net
Partial Class Default
    
Inherits Page
C#应该类似Default : Page
现在只要改成
Partial Class Default
    
Inherits ChPage
C#相应为 Default:ChPage
就可以了

使用时只要在载入前的某个事件,比如Init或Load写 SetHtmlScript("/Javascript/MicrosoftAjax.js")
这样就OK了
 
直接再看看生成的HTML,吼吼,已经有你添加的<script src=""/Javascript/MicrosoftAjax.js" type="text/javascript"></script>了

本如果文章中有不足的地方请大家要提出啊


posted @ 2007-08-01 12:47 重典 阅读(1618) 评论(15)  编辑 收藏

  回复  引用    
#1楼 2007-08-01 12:50 | lee [未注册用户]
看到署名以为是csdn的zou jian.

  回复  引用  查看    
#2楼 2007-08-01 12:59 | JerryChou      
HtmlGenericControl
  回复  引用  查看    
#3楼 [楼主]2007-08-01 13:08 | 邹健      
@JerryChou
嗯用HtmlGenericControl 也可以
只是不用再写那个类SetHtmlScript也可以写成
protected void SetHtmlScript(string src) {
HtmlGenericControl h = new HtmlGenericControl("script");
h.Attributes.Add("type","text/javascript");
h.Attributes.Add("src", src);
Page.Header.Controls.Add(h);
}
谢谢提点
  回复  引用    
#4楼 2007-08-01 13:09 | Stephen.Ju [未注册用户]
我也以为是邹建大哥呢,哈哈!
学习中.....
  回复  引用  查看    
#5楼 2007-08-01 13:10 | 代码乱了      
@lee
哈哈,我也有这样的错觉,还以为那个邹老大跑来搞.net了呢
  回复  引用  查看    
#6楼 [楼主]2007-08-01 13:11 | 邹健      
@代码乱了
汗了。。。貌似我还是没混个脸熟啊,要加大回帖力度了。。。体力活
  回复  引用  查看    
#7楼 [楼主]2007-08-01 13:22 | 邹健      
晕了,标题发日志时被屏 了!!!!!!!
原标题应该为Asp.net中动态在<head />中加入Scrpit标签看来是。。。意外
  回复  引用  查看    
#8楼 2007-08-01 13:42 | 风焰庄主      
只能用好长好长的……号来表示意见
  回复  引用  查看    
#9楼 [楼主]2007-08-01 13:45 | 邹健      
@风焰庄主
如此啊... ...
见笑了,哈哈
  回复  引用    
#10楼 2007-08-01 13:47 | pwqzc [未注册用户]
又见老大拉!
怎么很少在这里看到你的sql文章啊?
csdn的邹健?
  回复  引用    
#11楼 2007-08-01 14:05 | 古巴 [未注册用户]
系统不是自带了个ClientScriptManager.RegisterClientScriptInclude用来添加js文件么?请问这里说的这个方法的主要目的是什么?或者说和.net自带这个方法主要区别在那里?
  回复  引用  查看    
#12楼 [楼主]2007-08-01 14:22 | 邹健      
@古巴
几乎是一样的,只是原来的注册脚本是向BODY中添加脚本块或引用文件
我写这个是向head中
只有在执行顺序不同时才可以看出不同
  回复  引用    
#13楼 2007-08-01 14:43 | 古巴 [未注册用户]
@邹健
哦,明白了,谢谢
  回复  引用    
#14楼 2007-11-03 20:55 | elvis [未注册用户]
如果要加脚本代码,而不是写好的js呢?同样是要加到<head>中

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-08-01 14:04 编辑过


相关链接: