.NET----在用户控件利用包装属性+反射,使用引用页的ViewState

最近做东西逐渐边做边重构了,重构完看到精简的代码感觉非常爽的说~哈哈 
前天从图书列表页提取出一个用户控件,这个玩意是用来按字段排序图书,选择每页显示数量的。它里面要用到ViewState保存排序字段和每页数量,为了灵活起见,把ViewState存到了引用页面的自定义一父类PageBaseProduct里,这样就可以随时在引用页改变ViewState的值了!然后在用户控件使用ViewState,运行发现错误:ViewState为空!!奇怪了,难道用户控件就不能使用引用页的ViewState吗??后来发现,ViewState是protected型,由于是在引用页的父类定义的,所以只能有引用页及其父类使用! 
这可咋办呢?上csdn吧!提个问题!一会就有人回答了,按他的方法:先在引用页父类加个排序字段属性SortField,并在构造方法里初始化个ViewState["SortField"],然后用SortField封装这个ViewState["SortField"],代码如下: 
public PageBaseProduct() 

    ViewState["SortField"] = "InsertTime"; 
    ViewState["SortType"] = "DESC"; 

public string SortField 

    get { return ViewState["SortField"].ToString(); } 
    set { ViewState["SortField"] = value; } 

最后在用户控件里利用反射,调用引用页绑定数据的私有方法: 
private PageBaseProduct p = null; 
private MethodInfo mi = null; 
AspNetPager pager = null; 
protected void Page_Load(object sender, EventArgs e) 

    p = this.Page; 
    Type ty = p.GetType(); 
    mi = ty.GetMethod("BindRp_Product");//BindRp_Product为引用页绑定数据的私有方法 

... 
//点击图片,按销量排序 
protected void ImgOrderByBuyCount_Click(object sender, ImageClickEventArgs e) 

    //可以通过修改引用页父类的SortField属性,修改其封装的ViewState["SortField"] 
    p.SortField = ImgOrderByBuyCount.CommandName; 
    ... 
    mi.Invoke(p, null);//参数p为mi代表的方法所属的对象,null为mi方法的参数 


这样,就解决了在不能在用户控件调用引用页ViewState的问题!

posted @ 2013-11-01 15:06  zagelover  阅读(167)  评论(0编辑  收藏  举报