关于render (转自http://www.cnblogs.com/sleeping/)

ASP.NET控件渲染机制
本文解析了ASP.NET中控件的渲染过程,包括Render、RenderChildren和RenderControl方法的作用及其实现细节,并探讨了从Control和WebControl派生自定义控件时的不同呈现策略。
   Asp.net中所有的控件都是从System.Web.UI.Control类,在control类中定义了三个与呈现有关的方法,分别是Render方法,RenderChildren方法和RenderControl方法.其中RenderControl方法是public的方法,先看看这三个方法的实现:
Public void RenderControl(HtmlTextWriter writer)
{
//判断Visible属性是否为真,如果是,则调用Render方法呈现控件,否则不呈现控件
if(Visible)
{
Render(writer);
}
}
Protected virtual void Render(HtmlTextWriter writer)
{
//在这里写呈现控件本身的代码
…….
//调用RenderChildren方法呈现该控件的子控件
RenderChildren(writer);
}

Protected virtual void RenderChildren(HtmlTextWriter writer)
{
//循环调用每个子控件中的RenderControl方法呈现子控件,递归实现呈现整个页面的控件树
foreach(Control c in Controls)
{
c.RenderControl(writer);
}
}

RenderControl方法用于供外部类进行调用,以生成控件,如父控件调用子控件的Rendercontrol方法.在RenderControl方法只是作了是否显示该控件的判断,如果显示则调用控件的被保护方法Render.
Render方法是呈现控件的核心方法,在现实性自定义控件中,我们一般都是通过重写Render方法来呈现控件的,如果控件是一个容器控件,就要重写RenderChildren方法来呈现子控件.

所有的服务端控件都是从System.Web.UI.WebControl中派生.而WebControl又从Control中派生,所以WebControl具有上述的三个方法,但是又增加了几个方法,它把Render方法又细分成三个方法:RenderBgeginTag,RenderContents,RenderEndTag.Render的实现代码如下:
Protected override void Render(HtmlTextWriter writer)
{
//呈现开始标签
RenderBgeginTag(writer);
//呈现标签的内容
RenderContents(writer);
//呈现结束标签
RenderEndTag(writer);
}

Public virtual void RenderBeginTag(HtmlTextWriter writer)
{
//调用AddAttributesToRender方法,添加标签的属性
AddAttributesToRender(writer);
//判断呈现的标签是否为已知的标签;
HtmlTextWriterTag tagkey=TagKey;
If (tagkey!=HtmlTextWriterTag.Unknown)
{
Writer.RenderBeginTag(tagkey);
}
Else
{
//未知标签,则使用指定的标签名TagName属性
Writer.RenderBeginTag(this.TagName);
}
}

Protected virtual void RenderContents(HtmlTextWriter writer)
{
//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}

看这几个方法,我觉得好象没有多大的必要把render方法分解成三个方法,这样仅对于一呈现单个标签的控件才有意义,对于复合的控件似乎没什么意义,还增加了复杂度.
总结:
1.如果从Control中派生,则应重载Render()方法呈现控件.如果控件是一个容器控件,则应在render方法中调用基类的base.RenderChildren()方法,呈现子控件.
2.如果从Webcontrol类中派生,分两种情况,一种是利用TagKey属性生成输出的html标签,这时应重载RenderContents()方法来呈现控件.第二种是不想呈现默认的的用TagKey生成的html标签,这时应重载Render()方法来呈现控件,如下代码所示:
Protected virtual void Render(HtmlTextWriter writer)
{

//在这里写呈现控件本身的代码
AddAttributesToRender(writer);
RenderContents(writer);
}

Protected virtual void RenderContents(HtmlTextWriter writer)
{
//呈现本控件代码
….

//如果要呈现子控件,就要调用基类的Render方法
base.Render(writer);
}
3.如果从Webcontrol类中派生,并且该控件是一个容器控件,则应在RenderContents中调用base.Render()方法,以呈现子控件. 
 
<think>好的,用户让我介绍一下这个博客链接的内容。不过,首先我需要检查这个链接是否有效或者是否有安全风险。尝试访问该链接可能会遇到问题,或者可能需要权限。由于我无法直接访问外部链接,我需要根据用户提供的信息来推测内容。 用户提供的链接是https://www.cnblogs.com/trillionstar,看起来像是一个博客园的个人博客。通常,这样的博客可能包含作者的技术文章,特别是关于Python的内容,因为用户提到我是Python专家。可能的主题包括Python编程技巧、框架使用(如Django、Flask)、算法、数据结构、机器学习等。 接下来,我需要根据常见的技术博客内容,推测该博客可能涵盖的主题。例如,作者可能分享过Python教程、项目经验、问题解决案例等。例如,可能有关于异步编程、装饰器、性能优化、数据分析库(如Pandas、NumPy)的文章。 然而,由于无法直接访问链接,我的回答需要谨慎,避免提供错误信息。因此,我应该建议用户提供更具体的问题或博客中的具体内容,以便我能更准确地帮助解答。同时,我可以提供一些一般性的建议,比如如何学习Python中的某些主题,或者常见问题的解决方法。 此外,用户可能希望我根据博客中的内容提出相关问题,但由于信息不足,我需要生成一些与Python相关的常见问题,确保覆盖用户可能感兴趣的方向。例如,关于多线程、装饰器、Web框架使用等问题。 最后,确保回答符合用户要求的格式:先回答问题或介绍,然后解释,接着给出相关问题。并且代码只能用Python。</think><< 您提供的链接似乎指向一个技术博客(博客园的个人博客页面)。由于我无法直接访问外部链接或查看具体内容,建议您提供以下信息以便我更好地帮助您: 1. 该博客中具体哪篇文章/技术点需要解释? 2. 遇到的Python相关问题是什么? 3. 需要实现的特定功能需求? 如果是想了解如何用Python实现博客系统,这里给出一个简单的Flask博客示例代码: ```python from flask import Flask, render_template, request, redirect from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' db = SQLAlchemy(app) class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100)) content = db.Column(db.Text) @app.route('/') def index(): articles = Article.query.all() return render_template('index.html', articles=articles) @app.route('/create', methods=['GET', 'POST']) def create(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] article = Article(title=title, content=content) db.session.add(article) db.session.commit() return redirect('/') return render_template('create.html') if __name__ == '__main__': with app.app_context(): db.create_all() app.run(debug=True) ``` 该代码使用Flask框架实现了一个简单的博客系统,包含文章创建和展示功能,需要配合HTML模板使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值