让阳光指引生命的每一刻,乘着风,跟随我融化空气

美丽的地球,有美丽的cnblog [hjp3]hjptype=song&player=1&son=http://www.taihugolf.com.cn/villa/sound_00ok01.mp3&autoplay=yes&autoreplay=1&bgcolor=FFFFFF&width=200&height=20[/hjp3]

2008年8月9日 #

实现自己的MasterPage和WebPart控件,开发没有aspx,ascx的web程序,全部由自定义控件生成,并且支持MasterPage摸版功能。

    实现自己的MasterPage和WebPart控件


    开发没有aspx,ascx的web程序,全部由自定义控件生成,并且支持MasterPage摸版功能。

 

    asp.net提供的MasterPage确实是一个好的功能,我也很需要这样的东西,可是我想更多的扩展一下,以实现自己的MasterPage控件。需要支持可以动态更改title,动态添加关键字,动态添加css, 动态添加script。这是个不错的想法,如何实现?

 

    那么我们回到asp.net服务器控件的架构上来,先来熟悉下它,理解它的生命周期,这个很重要,我可不开玩笑,因为我需要对它加以利用,动点小手术,因此你必须必须理解它,否则,请放下键盘,拿起你的吉他,一边玩儿^_*。

 

    在你放下键盘那起吉他之前,请把我这篇文章看完,好了,在这里我只谈2.0的相关部分。

 

    ===================控件生命周期开始===================
    控件构造器
    初始化阶段 Init事件
    -----加载视图状态
    -----加载回传数据
    加载阶段 Load事件
    -----引发数据修改事件
    -----引发回传事件
    预生成阶段 PreRender
    保存视图状态
    生成阶段
    卸载阶段 Unload
    释放
    ===================控件生命周期结束===================

    以上的东西写的文章已经很多了,我只凭记忆把他写出来,不对的地方,大家指正。


    还有一个需要熟悉的东西就是控件的渲染流程,你需要理解他,不管怎样,你都要理解他,请暂时放下你的吉他,理解它,真的,实在太重要了。


    Control控件暴露了一个公共的RenderControl(HtmlTextWrite write)方法,用与生成html到输出流。
这个方法是这么定义的,这里我说的是2.0。
    RenderControl(HtmlTextWrite write)
    {
        if(可视)
        {
           继续Render(write);
        }
    }

    看到了,如果当前控件的Visible属性设置为true的话,它才会调用Render方法,注意这个方法是受保护的,不是由你来调用的,不过你还是有机会调用他的,放心,继续看下面。
    除非你继承Control控件,否则你只能近接的调用他,也就是由Page框架或是Control的RenderControl方法调用它。

    Render方法是这样的:
    Render(HtmlTextWrite write)
    {
        继续RenderChildren(write);   
    }


    看上去是去生成子控件,确实如此,RenderChildren是这样的:

    RenderChildren(HtmlTextWrite write)
    {
        foreach(Control control in Controls)
        {
            RenderControl(write); //这里我近接的调用了Render方法,虽然你是受到保护的。可我还是调用啦
        }
    }


    看到了,RenderChildren里面有回去了,原来Control控件的渲染流程是这样的啊,通过判断自己的Contros属性来不断的调用,只到自己的所有子控件都调用到,好家伙。

    以上提到的是写web服务器控件的必备知识,很基础,但是你不可以小视他,一点要过他,你才会写出好的控件来。

 

    web开发的底层就是一堆的HTML标签,无论是jsp还是asp.net都是对html某种方式的包装,是HTML的产物,IE浏览器访问web服务器,最终我们接收到的还是html文本。IE然后通过渲染引擎解释这些标签,在屏幕上展现出来可见的效果。

 

    asp.net提供了很多服务器控件,提供了很多所见即所得的功能,丰富了web应用程序的开发。

 

    这些服务器控件架构,有些地方我们是可以利用的,就是说我们自己可以来扩展,写出符合自己需求的控件来。asp.net web Control带有太多的样式属性,比如说Panel控件,就有如Color,Width等各种属性,因为它继承于WebControl控件。如果你需要这么一个Panel类似的控件 ,可是你有不需要那些从WebControl继承而来的属性,那么好的选择就是你直接继承Control控件,这个控件只有基本的控件架构,而没有那些可见的web样式属性。

 

    恰好我需要这样的控件,因为我不需要那些可见的web样式属性,因为我要生成的控件通过CSS文件来控制的,也就是所有的空间都只输出Div这个标签。如果这样的标签:

    <div id="id" class="class">
        <div id="id_children" class="class_container">
            <ul><li></li></ul>
        </div>
        <div id="id_children" class="class_container"> </div>
    </div>

    如上,标签时可以嵌套的。

 

    到这里开始自己动手,创建自己的MasterPage控件,因为我不需要样式控制,所以我选择继承Control控件,以便于利用他的架构模型和渲染模型。


    public class MasterControl : Control
    {
        #region //字段
        protected string id;
        protected string title;
        protected string keyword;
        protected List<string> css;
        protected List<string> script;
        protected Page page;
        #endregion
        //略去N行代码...
        #region //重写基类方法
        protected override void Render(HtmlTextWriter writer){....}
        #endregion

        #region //私有方法
        private void GenericHeadHTML(HtmlTextWriter writer)
        {
            writer.AddAttribute("http-equiv", "Content-Type");
            writer.AddAttribute(HtmlTextWriterAttribute.Content, "text/html; charset=utf-8");
            writer.RenderBeginTag(HtmlTextWriterTag.Meta);
            writer.RenderEndTag();

            writer.WriteLine();

            writer.AddAttribute("http-equiv", "Content-Language");
            writer.AddAttribute(HtmlTextWriterAttribute.Content, "zh-CN");
            writer.RenderBeginTag(HtmlTextWriterTag.Meta);
            writer.RenderEndTag();

            writer.WriteLine();

            writer.AddAttribute(HtmlTextWriterAttribute.Name, "keywords");
            writer.AddAttribute(HtmlTextWriterAttribute.Content, keyword);
            writer.RenderBeginTag(HtmlTextWriterTag.Meta);
            writer.RenderEndTag();

            writer.WriteLine();

            writer.RenderBeginTag(HtmlTextWriterTag.Title);
            writer.Write(title.Remove(title.Length - 3));
            writer.RenderEndTag();

            writer.WriteLine();

            foreach (string itemCss in css)
            {               
                writer.AddAttribute(HtmlTextWriterAttribute.Rel, "stylesheet");
                writer.AddAttribute(HtmlTextWriterAttribute.Href, itemCss);
                writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
                writer.AddAttribute("media", "all");
                writer.RenderBeginTag(HtmlTextWriterTag.Link);
                writer.RenderEndTag();
                writer.WriteLine();
            }

            foreach (string itemScript in script)
            {
                writer.WriteLine("<script type=\"text/javascript\" src=\"" + itemScript +"\" ></script>");
            }
        }
        #endregion
    }

 

    namespace MINGMING.MUSIC.Contorls
    {
        public class MasterPage : MasterControl
        {
            #region //字段
            protected ControlContainerBase headerLayout, contentLayout, footerLayout;
            #endregion

            #region //构造方法
            public MasterPage(Page page)
                : base(page)
            {
                headerLayout = new FooterLayout(this);
                contentLayout = new ContentLayout(this);
                footerLayout = new HeaderLayout(this);
            }
            #endregion
        }
    }

 

页面调用测试:

        #region 字段
        protected RequestContext requestContext; //web部件需要的请求上下文
        protected NewsPartZone news1, news2, news3, news4; //web部件
        protected MasterControl masterPage; //MasterPage模板控件
        #endregion

        #region //重写基类方法
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            requestContext = new RequestContext();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Initialize(); //初始化
        }
        #endregion

        #region //初始化
        private void Initialize()
        {
            #region
            /*
            NewsEntity newsEntity = new NewsEntity();
            NewsCategoryEntity newsCategoryEntity = new NewsCategoryEntity();
            List<NewsEntity> newsList ;
            List<NewsCategoryEntity> newsCategorys ;
            int totalRecord;

            newsEntity.ID = 3;
            newsEntity.Title = "testTitle88888";
            newsEntity.Content = "testContent88888";
            newsEntity.Author = "liuming";
            newsEntity.ImageFilename = null;
            newsEntity.HTMLFilename = "888880100.html";
            newsEntity.Category.ID = 1;
            newsEntity.Template.ID = 1;

            newsBLL.Add(newsEntity);
            newsCategorys = newsCategoryBLL.GetAll();
            newsList = newsBLL.GetPage(1, true, 1, 10, out totalRecord);
            */
            #endregion

            masterPage = new MasterPage(this); //自定义的MasterPage控件,为当前页设置MasterPage
            masterPage.ID = "layout"; //页面ID
            masterPage.Title = "test Title"; //页面标题
            masterPage.Keyword = "key1,key2,key3"; //页面关键字
            masterPage.Css.Add("/Resources/Css/main.css"); //当前页面所需要的样式表文件
            masterPage.Script.Add("/Resources/Script/main.js"); //当前页面所需要的脚本文件

            requestContext.PageHit.PageIndex = 1; //部件需要的请求上下文
            requestContext.PageHit.PageSize = 2;

            news1 = new NewsPartZone(); //部件1
            news1.ID = "news_partzone"; //部件1 ID
            news1.IsShowHeader = true; //是否显示部件的Header区域
            news1.Title = "部件1"; //Header区域的文字
            news1.Parent = masterPage.Controls[1] as ControlContainerBase; //部件的父容器
            news1.RequestContext = requestContext; //请求上下文
            news1.MasterPage = masterPage; //部件的MasterPage
            news1.Initialize(); //将所有子控件加到控件树,然后将自己加到MasterPage里面,也就是把自己加到Parent属性所指向的对象

            requestContext.PageHit.PageIndex = 1;
            requestContext.PageHit.PageSize = 3;

            news2 = new NewsPartZone(); //部件2
            news2.ID = "news_partzone2";          
            news2.Title = "部件2"; //这个title不会显示出来
            news2.Parent = masterPage.Controls[1] as ControlContainerBase;
            news2.RequestContext = requestContext;
            news2.MasterPage = masterPage;
            news2.Initialize();

            news3 = new NewsPartZone(); //部件3
            news3.ID = "news_partzone3";
            news3.IsShowHeader = true;
            news3.Title = "部件3";
            news3.Parent = masterPage.Controls[1] as ControlContainerBase;
            news3.RequestContext = requestContext;
            news3.MasterPage = masterPage;
            news3.Initialize();


            requestContext.PageHit.PageIndex = 1;
            requestContext.PageHit.PageSize = 4;

            news4 = new NewsPartZone(); //部件4
            news4.ID = "news_partzone3";
            news4.Title = "部件3"; //这个title不会显示出来
            news4.Parent = masterPage.Controls[2] as ControlContainerBase;
            news4.RequestContext = requestContext;
            news4.MasterPage = masterPage;
            news4.Initialize();
        }
        #endregion

 

最终生成的网页代码如下:
下面的这个HTML标签全部由程序生成,所有的字符,包括头部区域的。都是从服务器端动态生成出来的。

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Language" content="zh-CN" />
  <meta name="keywords" content="key1,key2,key3" />
  <title>
   test Title - this.owner.MasterPage.Title - this.owner.MasterPage.Title - this.owner.MasterPage.Title - this.owner.MasterPage.Title
  </title>
  <link rel="stylesheet" href="/Resources/Css/main.css" type="text/css" media="all" />
  <link rel="stylesheet" href="/Resources/Css/newsList.css" type="text/css" media="all" />
  <link rel="stylesheet" href="/Resources/Css/newsList.css" type="text/css" media="all" />
  <link rel="stylesheet" href="/Resources/Css/newsList.css" type="text/css" media="all" />
  <link rel="stylesheet" href="/Resources/Css/newsList.css" type="text/css" media="all" />
  <script type="text/javascript" src="/Resources/Script/main.js" ></script>
  <script type="text/javascript" src="/Resources/Script/news.js" ></script>
  <script type="text/javascript" src="/Resources/Script/news.js" ></script>
  <script type="text/javascript" src="/Resources/Script/news.js" ></script>
  <script type="text/javascript" src="/Resources/Script/news.js" ></script>

 </head>
 <body>
  <div id="layout">
   <div id="layout_footer">
    Page_Header - 这里是页头
   </div>
   <div id="layout_content">
    <div id="news_partzone" class="partzone">
     <div id="news_partzone_header" class="partzone_header">
      部件1
     </div>
     <div id="news_partzone_content" class="partzone_content">
      <div id="news_list_container">
       <ul><li>网络歌曲“黑色巧克力“ 07 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 06 - 颜绘唐</li></ul>
      </div>
      <div id="page_hit">

      </div>

     </div>
    </div><div id="news_partzone2" class="partzone">
     <div id="news_partzone2_content" class="partzone_content">
      <div id="news_list_container">
       <ul><li>网络歌曲“黑色巧克力“ 07 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 06 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 05 - 颜绘唐</li></ul>
      </div>
      <div id="page_hit">

      </div>

     </div>
    </div><div id="news_partzone3" class="partzone">
     <div id="news_partzone3_header" class="partzone_header">
      部件3
     </div>
     <div id="news_partzone3_content" class="partzone_content">
      <div id="news_list_container">
       <ul><li>网络歌曲“黑色巧克力“ 07 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 06 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 05 - 颜绘唐</li></ul>
      </div>
      <div id="page_hit">

      </div>

     </div>
    </div>
   </div>
   <div id="layout_header">
    Page_Footer - 这里是页脚<div id="news_partzone3" class="partzone">
     <div id="news_partzone3_content" class="partzone_content">
      <div id="news_list_container">
       <ul><li>网络歌曲“黑色巧克力“ 07 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 06 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 05 - 颜绘唐</li><li>网络歌曲“黑色巧克力“ 04 - 颜绘唐</li></ul>
      </div>
      <div id="page_hit">

      </div>

     </div>
    </div>
   </div>

  </div>
 </body>
</html>

 

附图片:

 

 

 

 

 

 

 

 

 


 

posted @ 2008-08-09 18:17 天真的好蓝啊 阅读(1569) | 评论 (7)编辑

2008年8月2日 #

as3写的音乐播放器,支持从服务器读取歌曲专辑列表,以及个人prifile信息动态显示,同时支持广告~

 

 

 

as3写的一个flash音乐播放器

 

支持从服务器读取歌曲专辑列表,以及个人prifile信息动态显示,同时

 

支持广告~

 

 

 

支持动态读取歌曲列表,可以配置xml从服务器端地址读取专集和歌曲列表

动态加载图片广告,以及全部音频播放器的功能支持。

 

 

 

 

 

此音频播放器为自己的好友原创音乐人“颜绘唐”所写

 

 

以上歌曲均出自他手,作品版权均以注册,支持网络原创音乐~!

 

点击这里访问“颜绘唐”的原创音乐博客

 

 

 

 

 

posted @ 2008-08-02 21:20 天真的好蓝啊 阅读(143) | 评论 (1)编辑

2008年5月30日 #

地震无情人有情,网络原创5.12四川汶川抗震救灾励志歌曲:"我生命的...太阳"!

 

地震无情人有情 抗震救灾励志歌曲

抗震救灾励志歌曲,网络原创音乐人颜绘唐网络原创"我生命的...太阳"!  

 颜绘唐baidu帖吧地址:
http://post.baidu.com/f?kw=%D1%D5%BB%E6%CC%C6 
 


    5。12汶川地震让全国人民无比的沉疼,看到那些无辜小生命的离去,让我们为世去的人默哀,为活着的人加油。无论有多大的灾乱只要我们团结一起,都会克服,我们在危难的时候都需要爱和帮助,此时此刻,人民子弟兵,救助志愿者,感动一幕幕出现的我们的眼前.

     网络音乐人颜绘唐为灾区儿童倾力创作励志歌曲“我生命的...太阳”,让失去亲人的孩子们更加坚强的活下去,重建我们美好的家园...... 

    歌词:我生命的...太阳
    ------------------------------------------ 
    有谁比我孤单 就让我给你温暖
    有谁比我还冷 我有一个火热的吻
    有谁没有希望 请忘掉所有悲伤
    只要勇敢坚强 就像草原盘旋的鹰一样
    自由的在蓝天上翱翔
    当我不再孤单 是你给我的温暖
    当我不再悲伤 是你让我更坚强
    当我不再彷徨 你说未来的路很长
    当我开始幻想 是你让我看见了希望
    你就像我生命里的太阳
    你的爱 我永远不会忘记
    你让我感到存在的意义
    有谁比我孤单 就让我给你温暖
    有谁比我还冷 我有一个火热的吻
    有谁没有希望 请忘掉所有悲伤
    只要勇敢坚强 就像草原盘旋的鹰一样
    自由的在蓝天上翱翔
    是你让我看见了希望 你就像我生命的太阳
    你就像我生命的太阳

 


 

posted @ 2008-05-30 11:50 天真的好蓝啊 阅读(248) | 评论 (1)编辑

2008年5月17日 #

网络原创5.12四川汶川抗震救灾歌曲:"伸出你的双手来 颗颗红心汇成海"!

     摘要: 5.12四川汶川

网络原创5.12四川汶川抗震救灾歌曲:"伸出你的双手来 颗颗红心汇成海"!

没有人能相信 这一切来得太突然 大地的一次颤抖 给人们带来惶恐
没有人能够明白 瞬间都改变 生命和那家园
瞬间一切都没有了 美丽家园变尘埃 美丽孩童笑容在废墟里被深埋
面对苍天却无奈 只剩凄凉的呐喊 这一切却真实地发生在我们身边

伸出你的双手来 颗颗红心汇成海
再大的风雨也不能阻挡我们团结一致的心
无论前面的路坎坷 无论前面困难重重
只要我们能一心 必将战胜一切一切......

伸出你的双手来 颗颗红心汇成海
去帮助那些失去家园的人们

伸出你的双手来 颗颗红心汇成海
为了家园最美好的明天
  阅读全文

posted @ 2008-05-17 13:22 天真的好蓝啊 阅读(2639) | 评论 (1)编辑

2008年5月15日 #

5.12地震报道感人语录摘抄"我就一句话,是人民在养你们,你们自己看着办"!


请允许我发到首页,看完网络上的报道,我鼻子酸酸的,眼泪莫名而出,男人哭吧不是罪!








一位战士 :  "求求你们让我再去救一个!我还能再救一个! "

温总理 :  救人心切的温总理罕有地发怒:“当温总理接到电话,听说由于桥梁倒塌,彭州市10万群众被堵在山中,救灾人员和物资无法运入时,总理在电话里大喊,‘我不管你们怎么样,我只要这10万群众脱险,这是命令!’之后他把电话挂了。”

总理向前往汶川的登机部队领导发出指示,“我就一句话,是人民在养你们,你们自己看着办。

记者 :  中国的王牌军再次出动(15军是解放军的甲等主力军,他的战绩就是美国人为之色变的——上甘岭) ,很多人都写了遗书


我们的"平民总理"最近头发白了很多,辛苦了!

posted @ 2008-05-15 09:35 天真的好蓝啊 阅读(7749) | 评论 (61)编辑

2007年11月13日 #

详解ProfileManager内部是如何运行的!

     摘要: 对于asp.NET2.0内置的profile有人支持,确也有不少高人说不过如此,所谓"鸡肋"!
那么下面我从它的设计意图,在代码层次上予以介绍,在完全了解了它的思想后我们也可以模仿这样的解决方案,如有错误之处还请高人指点!

先运行private static void Initialize (bool throwIfNotEnabled)
  阅读全文

posted @ 2007-11-13 23:34 天真的好蓝啊 阅读(190) | 评论 (0)编辑

2007年6月5日 #

Flex MXML+as3 VS WPF XAML+c#

     摘要: Flex Framework 与 Microsoft WPF是非常像的,都是用各自独有的相关XML语法来表达界面。
WPF的是XAML , 而Flex的是MXML。同样都是XML语法表述。它们都用来表述UI,包含属性,事件,行为,数据绑定,效果等,都有各自的一套相关控件。
Flex开始出来的MXML需要在FlexBuilder环境编译,出来以后就是一个swf文件。  阅读全文

posted @ 2007-06-05 09:54 天真的好蓝啊 阅读(691) | 评论 (1)编辑

2007年5月28日 #

FlashMX2004环境下用AS脚本开发的一个FlashMP3播放器

     摘要: 用了差不多4天时间,开发了一个myPlayer类,暴露了多个相关的方法和属性。

支持XML歌曲列表播放,不过这里没地方传xml文件,所有内部会判断一个变量是否定义为undefined,如果是,那么里面就会播放内置的两个mp3地址文件。  阅读全文

posted @ 2007-05-28 09:40 天真的好蓝啊 阅读(249) | 评论 (0)编辑

2007年5月23日 #

asp.NET自定义服务器控件内部细节系列教程七(状态管理)

     摘要: Contorl类的默认实现将状态管理委托给了ViewState属性,ViewState属性是一个复杂属性,该属性是一个StateBag类型,是一个字典,StateBag类实现了IStateManager接口来实现状态管理。StateBag保存了键/值对,其中键是字符串而值是对象。当某个对象添加到StateBag实例中时,StageBag自动为该对象存储一个附加位,它用来标志存储的对象是否修改过。

Control类用于IStateManager接口中相同的成员来实现状态管理,尽管Control并不实现IStateManager接口,只是委托给了实现了IStateManager接口类型的StateBag类,也就是委托给了ViewState属性。在自己的复杂类型状态管理中,可以模仿Control的这种行为,以实现自定义复杂属性的状态管理。
  阅读全文

posted @ 2007-05-23 14:57 天真的好蓝啊 阅读(1906) | 评论 (1)编辑

asp.NET自定义服务器控件内部细节系列教程六(复杂属性)

     摘要: 复杂属性的类型不能用简单的字符串表示。这些类型包括非原子值的类型,除字符串外的引用类型以及集合类型。在使用自己的控件时如果遇到复杂属性,那么为了支持声明持久性还需要做额外的工作,并进行状态管理。
为了使复杂属性具有声明持久性,必须要由以下两个相关的内容一起作用实现:与串行化相关的元数据Attribute和执行给定类型与String类型及其它类型的互相转换的类型转换器,稍后我会讲到。

1.子属性的形式
1.1 连字符子属性的实现
1.2 内部属性的实现
1.3 内部默认属性的实现

2.属性和类型转换器
类型转换器是从System.ComponentModel.TypeConverter派生的一个类。页面框架使用类型转换器来实现视图状态的串行化,而且可视化设计器也适用类型转换器在浏览器中显示属性,并实现设计期的串行化。  阅读全文

posted @ 2007-05-23 14:54 天真的好蓝啊 阅读(1978) | 评论 (1)编辑

My Links

Blog Stats

News

与我联系

搜索

 

常用链接

留言簿(1)

我管理的小组

我参加的小组

我的标签

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

集从人之所长,创造博客社区神话,实现梦想!