当前位置:首页 > 技巧:使用User Control做HTML生成

技巧:使用User Control做HTML生成

点击次数:894  更新日期:2010-12-29
\n


\n

  User Control大家肯定不会陌生,在使用ASP.NET的过程中,除了aspx页面,最常见的就莫过于ascx了。ascx是一个有独立逻辑的组件,提供了强大的复用特性,合理使用,能够大大提高开发效率。通过User Control直接生成HTML内容其实已经是一个比较常用的技巧了(尤其在AJAX时代),不过网络上这方面的内容比较少,很多人还是在苦苦地拼接字符串,因此在这里我通过一个实例简单介绍一下这个技巧。


\n

  对一个对象(文章,图片,音乐,etc.)进行评论是应用中最常见的功能之一。首先,我们定义一个Comment类,以及其中会用到的“获取”方法:


\n

public partial class Comment
{
public DateTime CreateTime { get; set; }

public string Content { get; set; }
}

public partial class Comment
{
private static List<Comment> s_comments = new List<Comment>
{
new Comment
{
CreateTime = DateTime.Parse(“2007-1-1″),
Content = “今天天气不错”
},
new Comment
{
CreateTime = DateTime.Parse(“2007-1-2″),
Content = “挺风和日丽的”
},
new Comment
{
CreateTime = DateTime.Parse(“2007-1-3″),
Content = “我们下午没有课”
},
new Comment
{
CreateTime = DateTime.Parse(“2007-1-1″),
Content = “这的确挺爽的”
}
};

public static List<Comment> GetComments(int pageSize, int pageIndex, out int totalCount)
{
totalCount = s_comments.Count;

List<Comment> comments = new List<Comment>(pageSize);

for (int i = pageSize * (pageIndex – 1);
i < pageSize * pageIndex && i < s_comments.Count; i++)
{
comments.Add(s_comments[i]);
}

return comments;
}
}


\n

  为了显示一个评论列表,我们可以使用一个用户控件(ItemComments.aspx)来封装。自然,分页也是必不可少的:


\n

<asp:Repeater runat=”server” ID=”rptComments”>
<ItemTemplate>
时间:<%# (Container.DataItem as Comment).CreateTime.ToString() %><br />
内容:<%# (Container.DataItem as Comment).Content %>
</ItemTemplate>
<SeparatorTemplate>
<hr />
</SeparatorTemplate>
<FooterTemplate>
<hr />
</FooterTemplate>
</asp:Repeater>

<% if (this.PageIndex > 1)
{ %>
<a href=”/ViewItem.aspx?page=<%= this.PageIndex – 1 %>” title=”上一页”>上一页</a>&nbsp;
<% } %>

<% if (this.PageIndex * this.PageSize < this.TotalCount)
{ %>
<a href=”/ViewItem.aspx?page=<%= this.PageIndex + 1 %>” title=”上一页”>下一页</a>
<% } %>


\n

public partial class ItemComments : System.Web.UI.UserControl
{
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);

this.rptComments.DataSource = Comment.GetComments(this.PageSize,
this.PageIndex, out this.m_totalCount);
this.DataBind();
}

public int PageIndex { get; set; }

public int PageSize { get; set; }

private int m_totalCount;
public int TotalCount
{
get
{
return this.m_totalCount;
}
}
}


\n

  然后再页面(ViewItem.aspx)中使用这个组件:


\n

<div id=”comments”><demItemComments ID=”itemComments” runat=”server” /></div>


\n

public partial class ViewItem : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.itemComments.PageIndex = this.PageIndex;
}

protected int PageIndex
{
get
{
int result = 0;
Int32.TryParse(this.Request.QueryString["page"], out result);

return result > 0 ? result : 1;
}
}
}


\n

  打开ViewItem.aspx之后效果如下:


\n
时间:2007/1/1 0:00:00
内容:今天天气不错
\n

\n时间:2007/1/2 0:00:00
内容:挺风和日丽的
\n

\n时间:2007/1/3 0:00:00
内容:我们下午没有课
\n

\n下一页

\n