上一篇文章写到动态加载用户控件的简单应用
页面是用来浏览信息的!但是更重要的是和用户交互,根据不同的需求提供不同的内容服务,这是一种服务或是一种更贴近用户的人性化。(又在胡言乱语了! ^_^ )
动态加载叶面,根据不同的用户权限加载不懂的内容服务。根据用户的相应加载相应的内容服务。
还有另外一个应用就是做到页面与代码的分离。在 vs2003 里,一般 ascx 或 aspx 文件,在刚建立的时候都直接跟一个 cs 文件关联。那么我们在写程序的时候就不能分开来做。作叶面和写后台代码的不能分开。为了能够做到作业面与作后台代码的能完全分开来,我们可以把后台的所有代码当作一个组件来做就可以了!这样一个不用跟 cs 文件关联的 aspx 叶面文件直接引用一个组件就可以了!那么组件可以加载不同的 ascx 文件最后组成一个完整的叶面。就这样一个项目的开发就像个机车制造厂一样组装不同的零件就有辆车出来了。软件也可以拿来组装,零件我们也可以订制,最后整体就可以出来了!(常常看别人的文章的时候怎么就觉得废话那么多,原来发现我废话也不少! ^_^ )
好!让我们 step by step , 就从不需要关联 cs 文件的 aspx 叶面开始吧!(在 vs2005 里,我新建 aspx 叶面的时候就直接没有 cs 文件关联。但是直接有个不完整类型隐藏起来了。怎么用基类就成为问题了!隐藏部分应该是继承了 Page 了!那么根据单继承的原则我们是不能在继承别的类型的了。这个问题有待研究。)
根据 aspx 叶面运行原理。叶面要跟服务端交互必须通过一个 run at server 的 form 标签才能行得通。因此我不要先来写个 form 组件,那么 form 就应该是个容器的形势来承载叶面所有要与服务端交互的元素,(容器太重要了, namespace 也可以看作容器,只不过是不能放东西而已,是虚拟的容器)
1 、做 form 容器组建:继承继承他就行了,注意一点就是唯一 ID 的问题。自己继承的可能该改变了 ID, 那么回传的时候就找不到了啊。切记!当然 render 叶面的时候是通过遍历所有 form 容器内所有的组件来一个个 render 出来。所以要改 UniqueID。
示例一下:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace Region.Controls {
public class MyForm : System.Web.UI.HtmlControls.HtmlForm {
public override string UniqueID {
get {
if ( this .NoNameContainer && this .NamingContainer != this .Page ) {
return base .UniqueID.Substring( base .UniqueID.LastIndexOf(":")+1);
} else {
return base .UniqueID;
}
}
}
protected override void RenderAttributes(HtmlTextWriter writer) {
this . NoNameContainer = true ;
base .RenderAttributes (writer);
this . NoNameContainer = false ;
}
protected override void RenderChildren(HtmlTextWriter writer) {
this . NoNameContainer = true ;
base .RenderChildren (writer);
this . NoNameContainer = false ;
}
private Boolean NoNameContainer = false ;
}
}
未完(持续)