.net 自定义控件输出客户端HTML

看了很多网上的大大写的控件输出客户端html,但是大多数都是人云亦云,结果都会卡在render输出的情况。

在此我对我对我写的一个成功的例子。

首先我们来讲述下自定义控件输出客户端html的原理:

我们知道所有的服务器端控件最终都会解析成客户端代码在IE上面执行浏览,这里需要用到HtmlTextWriter

总所周知在控件render的时候会通过HtmlTextWriter输出到客户端

具体实现:

第一步:新建一个自定义控件CommentUI.ascx

 里面就一个repeater 控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CommentUI.ascx.cs" Inherits="WebAppClient.UserControl.CommentUI" %>
<asp:Repeater ID="repPL" runat="server">
    <ItemTemplate>   
        <table width="100%" class="lineTop"><tr><td>
            <div style="float:left;width:15%;">
                <asp:HyperLink ID="imgurl" runat="server"><img style="height:30px; width:30px" src="<%# ((System.Data.DataRowView)Container.DataItem)["Img30_30Path"]%>" title="<%# ((System.Data.DataRowView)Container.DataItem)["NickName"] %>"  id="<%# ((System.Data.DataRowView)Container.DataItem)["UserId"] %>"/ ></asp:HyperLink>
            </div>
            <div style="float:right;width:85%;">
                <asp:HyperLink ID="NName" runat="server"><%# ((System.Data.DataRowView)Container.DataItem)["NickName"]%></asp:HyperLink>:<%# ((System.Data.DataRowView)Container.DataItem)["Message"]%></div>
        </td></tr>
        <tr><td>
            <div style="float:right;">
                <%--<asp:HyperLink ID="JB" runat="server" Text="举报"></asp:HyperLink><span>|</span>--%>
                <asp:HyperLink ID="HF" runat="server" Text="回复"></asp:HyperLink>
            </div>
        </td></tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

 第二步:建立一个类ajaxpage

 

public class AjaxPage : Page
    {
        public override void VerifyRenderingInServerForm(Control control)
        {
            //base.VerifyRenderingInServerForm(control);
        }

        public override bool EnableEventValidation
        {
            get
            {
                return false;
            }
            set
            {
                base.EnableEventValidation = false;
            }
        }
    }

 

继承page防止出错误:控件要包含在runat="server"  等

第三步:实现输出逻辑

1、定义一个事件委托,自定义控件传参数

public delegate void EventControl(Control sender, EventArgs e,params object[] parms);

2、实现的自定义控件输出逻辑

 public static string RenderHtml<T>(this T p, string path, EventControl evt, params object[] parms)
            where T:AjaxPage
        {          
            Control ctl = p.LoadControl(path);
            StringBuilder sb = new StringBuilder();
            if (ctl != null)
            {  
                StringWriter sw = new StringWriter(sb);
                HtmlTextWriter htw = new HtmlTextWriter(sw);
                evt(ctl, new EventArgs(),parms);
                p.Controls.Add(ctl);
                p.RenderControl(htw);
            }
            return sb.ToString();
        }

posted on 2011-05-27 11:44  simonchan  阅读(1068)  评论(0)    收藏  举报