上一篇文章写到动态加载用户控件的简单应用
页面是用来浏览信息的!但是更重要的是和用户交互,根据不同的需求提供不同的内容服务,这是一种服务或是一种更贴近用户的人性化。(又在胡言乱语了!^_^)
动态加载叶面,根据不同的用户权限加载不懂的内容服务。根据用户的相应加载相应的内容服务。
还有另外一个应用就是做到页面与代码的分离。在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;
}
}
……