对用户控件(ascx)属性(property)赋值

时间:2023-03-08 16:56:23

对用户控件(ascx)属性(property)赋值

Insus.NET写此博文,是对用户控件(ASCX)的属性赋值经验与技巧分享。
是这样子的,在做新闻站点时,一般都会有分很多类别。 在站点首页会显示最新,最TOP 或最Hot的新闻或文章,而且是分类别来分的。因此,我们会设计成一个用户控件,用户控件的数据源均是来自Article这个表,只是传入不同的category 的ID值和 Top几条来实现。

用户控件.cs大约如下,高亮代码是两个属性,当然你的真实环境也许只有一个,或是更多的属性。 
对用户控件(ascx)属性(property)赋值

现在来演示网页引用用户控件,并赋值,分几种方法或是重构优化它们。
在创建一个网页,也就是说,你的网点上,哪个网页需要引用这个用户控件。用户控件呈现是需要在网页aspx。

第一种,最简单常用。打开.aspx,切换至design模式,
对用户控件(ascx)属性(property)赋值

然后把用户控件拉入网页:
对用户控件(ascx)属性(property)赋值

现在可以切换至source 模式,就可以直接在.aspx赋值了,参考高亮对属性赋值。
对用户控件(ascx)属性(property)赋值

第二种,如果你不想在.aspx赋值的话,可以在.aspx.cs进行赋值。把用户控件引入网页之后,按F7来到.aspx.cs代码页。
对用户控件(ascx)属性(property)赋值

上面第一种方法与第二种方法,只是赋值的位置不同而已。
OK,我们来演示第三种方法。为了功力发挥最高效果,长远的设计打算,因此Insus.NET先写一个接口,接口主体是一个函数,返回类型就是UserControl。
对用户控件(ascx)属性(property)赋值

用户控件实作这个接口,参考下图高亮部分代码:
对用户控件(ascx)属性(property)赋值

实现动态加载,不必在网页中的design和source切换来切换去。在网页中拉一个控件容器
对用户控件(ascx)属性(property)赋值

去.aspx.cs代码程序,参考下图:
对用户控件(ascx)属性(property)赋值

引用两个命名空间#9和#10行代码。其中#9代码,是为了能够应用到Reflection(反射)技术。
第#22行代码,是动态加载用户控件,并转换为接口。
第#25和#31行代码,箭头位置的字符串,就是用户控件的两个Public属性名称。

对用户控件(ascx)属性(property)赋值

第#28和#34行代码,即是对两个属性赋值。
第#37行代码,是把用户控件加载入PlaceHolder容器中去。

好的,三种方法,教你怎样在网页中,为用户控件的属性赋值。技术相信你增长不少吧。
整个演示已经完成。

接下为,Insus.NET再给你附送另外的技术,重构。你回过头来看看第三种方法的代码。第25至29与31至35两组代码,相似度都非常高。因此,减少代码的冗余,需要把它们写成一个方法。
对用户控件(ascx)属性(property)赋值

拿掉上图片中comment的代码。抽取出来,写成SetValue()方法。这样子,代码就变得清晰多了。成了这个样子:
对用户控件(ascx)属性(property)赋值

完成否,还有吗?
是的,没有完成,重构到这里,Insus.NET有想起,每个用户控件,属性有少有多。少的话也许没有什么关系,多的话,还得写很多

SetValue(uc, "TOP", 10);
SetValue(uc, "Category", 1);

这些相似的代码。为了解决这个问题,Insus.NET再次重构它们。希望能得到更好的效果。
对用户控件(ascx)属性(property)赋值

其实,还是可以把上图中的第32行代码,写成一个扩展方法:
对用户控件(ascx)属性(property)赋值

也就是说,把赋值部分,存放在一个集合中。
呵呵,完成了。方法可以选择性,觉得那一种好,就用那一种。