http://blog.leven.com.cn/article.asp?id=70
经常有这样情况出现,一个网页的某个列表,由于用户的不同而某些选项出现变化,例如,在blog中,如果用户是管理员,就可以看见删除blog和修改blog的链接,而没有登陆或者权限不够的话就没有链接的出现,在asp.net中,Repeate是典型的列表控件,所以对于在其他语言中可以轻松实现的功能,在.net倒没有办法轻易实现,当然,办法不是没有的,本文就是正式为了解决这个问题。
还是以刚才的blog为例,如果在Repeater的Item中有这样的链接:
<asp:HyperLink ID="Blog_Edit" runat="server" ToolTip="编辑该日志" AccessKey="E" NavigateUrl='<%#Eval("id","BlogPost.aspx?action=edit&id={0}") %>'><img src="images/icon_edit.gif" alt="" border="0" style="margin-bottom:-2px"/></asp:HyperLink>
<asp:HyperLink ID="Blog_Del" runat="server" ToolTip="删除该日志" NavigateUrl='<%#Eval("id","javascript:OnDel(\"Blog_Del.aspx?id={0}\")") %>'><img src="images/icon_del.gif" alt="" border="0" style="margin-bottom:-2px"/></asp:HyperLink>
这些要当管理员登陆之后才显示。
假设Session["Blog_UserType"]和Session["Blog_UserName"]中保存了用户登陆信息,那应该怎么做?
我们要操作Repeater的内容,那么就要选择Repeater还没有呈现出来的时候操作,例如,我可以在Repeater的ItemDataBound时间中进行操作。那我们可以在aspx文件中可以这样写:
<asp:Repeater ID="Content_List" runat="server" OnItemDataBound="Repeater_ItemDataBound">
然后在cs文件中写:
protected void Repeater_ItemDataBound(object sender,System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
}
这样发生ItemDataBound时间是会调用该函数。
确定修改时间,现在关键就是要如何修改了,我们要用到RepeaterItem的FindContro函数,寻找要修改的控件,然后修改,该例子具体的代码如下:
protected void Repeater_ItemDataBound(object sender,System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
string _type, _user;
try
{
_type = Session["Blog_UserType"].ToString();
_user = Session["Blog_UserName"].ToString();
}
catch
{
_type = string.Empty;
_user = string.Empty;
}
if (_type==string.Empty||_user==string.Empty)
{
RepeaterItem item = e.Item;
if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem))
{
((HyperLink)item.FindControl("Blog_Edit")).Visible = false;
((HyperLink)item.FindControl("Blog_Del")).Visible = false;
}
}
}
这样一来就实现了在不同状况下Repeater元素也有不同的显示。。