.NET中使用User Control做HTML生成
|
源代码网整理以下User Control大家肯定不会陌生,在使用ASP.NET的过程中,除了aspx页面,最常见的就莫过于ascx了。ascx是一个有独立逻辑的组件,提供了强大的复用特性,合理使用,能够大大提高开发效率。通过User Control直接生成HTML内容其实已经是一个比较常用的技巧了(尤其在AJAX时代),不过网络上这方面的内容比较少,很多人还是在苦苦地拼接字符串,因此在这里我通过一个实例简单介绍一下这个技巧。 源代码网整理以下 对一个对象(文章,图片,音乐,etc.)进行评论是应用中最常见的功能之一。首先,我们定义一个Comment类,以及其中会用到的“获取”方法: 源代码网整理以下public partial class Comment 源代码网整理以下public string Content { get; set; } 源代码网整理以下public partial class Comment 源代码网整理以下public static List GetComments(int pageSize, int pageIndex, out int totalCount) 源代码网整理以下List comments = new List(pageSize); 软件开发网 www.mscto.com
源代码网整理以下for (int i = pageSize * (pageIndex - 1); 源代码网整理以下return comments; 源代码网整理以下 为了显示一个评论列表,我们可以使用一个用户控件(ItemComments.aspx)来封装。自然,分页也是必不可少的: 源代码网整理以下 源代码网整理以下时间:<%# (Container.DataItem as Comment).CreateTime.ToString() %> 软件开发网 www.mscto.com 源代码网整理以下内容:<%# (Container.DataItem as Comment).Content %> 源代码网整理以下 源代码网整理以下 源代码网整理以下 源代码网整理以下 源代码网整理以下<% if (this.PageIndex > 1) 源代码网整理以下<% if (this.PageIndex * this.PageSize < this.TotalCount) 源代码网整理以下public partial class ItemComments : System.Web.UI.UserControl 源代码网整理以下this.rptComments.DataSource = Comment.GetComments(this.PageSize, 源代码网整理以下public int PageIndex { get; set; } 源代码网整理以下public int PageSize { get; set; } 软件开发网 www.mscto.com 源代码网整理以下private int m_totalCount; 源代码网整理以下 然后再页面(ViewItem.aspx)中使用这个组件: 源代码网整理以下 软件开发网 www.mscto.com 源代码网整理以下public partial class ViewItem : System.Web.UI.Page 源代码网整理以下protected int PageIndex 源代码网整理以下return result > 0 ? result : 1; 源代码网整理以下 打开ViewItem.aspx之后效果如下: 源代码网整理以下时间:2007/1/1 0:00:00 源代码网整理以下 功能是完成了,不过用着用着忽然觉得不妥,为什么呢?因为我们在翻页,或者用户发布评论的时候,整张页面都刷新了。这可不好,要知道可能ViewItem页中还有其他几个显示部分,它们可是不变的。而且如果其他几个部分也需要分页,那么可能就需要保留页面上每一部分的当前页码,这样开发的复杂性还是比较高的。 源代码网整理以下 那么我们不如用AJAX吧。无论是用户察看评论时进行翻页还是发表评论,都不会对页面上的其他内容造成影响。要开发这个功能,自然需要服务器端的支持,那么该怎么做呢?一般我们总是有两种选择: 源代码网整理以下服务器端返回JSON数据,在客户端操作DOM进行呈现。 源代码网整理以下 如果我们能够直接从ItemComments控件获得HTML内容该多好啊——那么我们就这么做吧。请看如下代码(GetComments.ashx): 源代码网整理以下public class GetComments : IHttpHandler 源代码网整理以下ViewManager viewManager = new ViewManager(); 源代码网整理以下control.PageIndex = Int32.Parse(context.Request.QueryString["page"]); 源代码网整理以下context.Response.Write(viewManager.RenderView(control)); 源代码网整理以下public bool IsReusable { ... } 源代码网整理以下 很简单的代码,不是吗?创建对象,设置属性,然后通过Response.Write输出而已。实在没什么大不了的——不过关键就在于ViewManager类,我们来看一下它是怎么实现的: 源代码网整理以下public class ViewManager where T : UserControl 源代码网整理以下public T LoadViewControl(string path) 源代码网整理以下public string RenderView(T control) 源代码网整理以下this.m_pageHolder.Controls.Add(control); 源代码网整理以下return output.ToString(); 源代码网整理以下 ViewManager中只有两个方法:LoadViewControl和RenderView。LoadViewControl方法的作用是创建一个 Control实例并返回,RenderView方法的作用则就是生成HTML了。这个实现方式的技巧在于使用了一个新建的Page对象作为生成控件的 “容器”,而最后其实我们是将Page对象的整个生命周期运行一遍,并且将结果输出。由于这个空的Page对象不会产生任何其他代码,因此我们得到的,就是用户控件生成的代码了。 软件开发网 www.mscto.com 源代码网整理以下 不过要实现这个AJAX效果,还需要做两件事情。 源代码网整理以下 第一,就是简单修改一下ItemComments控件中的翻页链接,让它被点击时调用一个JavaScript函数。例如“上一页”的代码就会变成: 源代码网整理以下 源代码网整理以下 第二,就是实现getComments这个客户端方法。在这里我使用了prototype框架,好处就是能够用相当简洁的代码来做到替换HTML的AJAX效果: 源代码网整理以下 软件开发网 www.mscto.com 源代码网整理以下 大功告成。 软件开发网 www.mscto.com 源代码网整理以下 其实就像之前所说的那样,使用UserControl进行HTML代码生成是一个十分常用的技巧。尤其在AJAX应用越来越普及的情况下,合理使用上面提到的方式可以方便的为我们的应用添加AJAX效果。而且很多情况下,我们即使不需要在页面上显示内容,也可以将内容使用UserControl进行编辑。因为编写UserControl比拼接字符串的方式无论是在开发效率上还是可维护性上都高出许多。由于这个方式其实使用了WebForms这个久经考验的模型,因此在执行效率方面也是相当高的。此外,就刚才的例子来说,使用UserCotrol进行HTML生成还有其他好处: 源代码网整理以下页面呈现逻辑只实现了一次,提高了可维护性。 源代码网推荐 源代码网供稿. |
