如何构建积木式Web应用.docx

上传人:b****7 文档编号:23587267 上传时间:2023-05-18 格式:DOCX 页数:23 大小:37.05KB
下载 相关 举报
如何构建积木式Web应用.docx_第1页
第1页 / 共23页
如何构建积木式Web应用.docx_第2页
第2页 / 共23页
如何构建积木式Web应用.docx_第3页
第3页 / 共23页
如何构建积木式Web应用.docx_第4页
第4页 / 共23页
如何构建积木式Web应用.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

如何构建积木式Web应用.docx

《如何构建积木式Web应用.docx》由会员分享,可在线阅读,更多相关《如何构建积木式Web应用.docx(23页珍藏版)》请在冰豆网上搜索。

如何构建积木式Web应用.docx

如何构建积木式Web应用

如何构建积木式Web应用

上下文

基本上我们在儿童时代都玩过积木玩具。

通过一块块的积木,再加上我们的想象力,就可以构造出非常多不同的风格的建筑。

那么,我们可不可以把这种搭积木的方式应用到我们的web应用上呢。

问题

web应用通过提供给用户一整套组件(相当于积木),以及一套已经成型的方案(相当于图纸)。

用户可以采用类似搭建积木的方式来根据自己的需要制作界面和应用。

环境

采用1.0或1.1

预备知识

C#,的服务器控件编程,服务器控件生命周期

最好具备以下知识

PageController,FrontController

解决方案

1、建立目录结构

为了了解如何采用积木块式应用,我们首先建立如下的主题目录结构:

在Sheme目录下保存所有的主题,每个主题都采用相同的目录结构。

UserControl目录保存最基本的积木块(UserControl),Page目录是积木块组成的页面所形成的UserControl,Css目录保存与积木块同名的css文件来控制UserControl的界面。

PageTeamplate.ascx是页面布局框架,根据所请求的页面不同,在PageTemplate的主体位置载入不同Page目录下的ascx文件。

2、划分自己的web积木——UserControl

将web应用分成一块块的积木,每一块积木形成一个UserControl,并且每一个UserControl有一个同名的css文件用来控制界面。

最基本的积木块要放在UserControl目录下,而由最基本积木块组成的页面文件放在Page目录下。

提示:

在一般的web应用中,都会有Header,Footer,Login等等这样的模块,这些模块就可以形成UserControl组成web应用的积木。

具体积木块应该根据你的web应用功能来划分,一般来说我们可以把某个功能就划分成一个积木

3、构建载入积木块的容器——MyPlaceHolder

有了UserControl这些积木块之后,就需要有能够自动在应用中载入这些UserControl积木的容器,这就是PlaceHolder。

不过,我们需要扩展PlaceHolder的功能达到自动载入UserControl的目的。

publicclassMyPlaceHolder:

PlaceHolder

{

privatestringuserControl;//要载入的UserControl目录下的.ascx

privatestringpageControl;//要载入的Page目录下的.ascx

publicMyPlaceHolder()

{

userControl="";

pageControl="";

}

publicstringUserControl

{

get

{

returnuserControl;

}

set

{

userControl=value;

}

}

publicstringPageControl

{

get

{

returnpageControl;

}

set

{

pageControl=value;

}

}

//当需要载入多个UserControl时,可以直接调用LoadUserControl

//当只需要载入一个UserControl时,可以调用Clear清除载入过的内容

publicvoidClear()

{

this.Controls.Clear();

}

//载入UserControl目录下的.ascx

//以及导入对应的css文件

publicvoidLoadUserControl(stringUserControl)

{

this.userControl=UserControl;

BasePagepage=(BasePage)this.Page;

//请参考后面的BasePage的代码

Controlcontrol=this.Page.LoadControl(

page.Scheme+"usercontrol/"+userControl+".ascx");

stringcss="css/"+userControl+".css";

//对应的css文件

if(File.Exists(this.Page.MapPath(page.Scheme+css)))

{

page.AddCss(page.Scheme+css);

}

this.Controls.Add(control);

}

//载入Page目录下的.ascx

//LoadPage与LoadUserControl的区别是两者载入的.ascx所在的目录不同

//Page目录下的.ascx可以看成是一些搭建主体结构的.ascx,其使用MyPlaceHolder

//来包含最基础的积木块.ascx(在UserControl目录下)

publicvoidLoadPage(stringPageControl)

{

this.PageControl=PageControl;

BasePagepage=(BasePage)this.Page;

Controlcontrol=this.Page.LoadControl(

page.Scheme+"page/"+pageControl+".ascx");

stringcss="css/"+pageControl+".css";

if(File.Exists(this.Page.MapPath(page.Scheme+css)))

{

page.AddCss(page.Scheme+css);

}

this.Controls.Add(control);

}

protectedoverridevoidOnLoad(EventArgse)

{

base.OnLoad(e);

if(!

userControl.Equals(string.Empty))

{

LoadUserControl(userControl);

}

}

}

publicclassMyPlaceHolder:

PlaceHolder

{

privatestringuserControl;//要载入的UserControl目录下的.ascx

privatestringpageControl;//要载入的Page目录下的.ascx

publicMyPlaceHolder()

{

userControl="";

pageControl="";

}

publicstringUserControl

{

get

{

returnuserControl;

}

set

{

userControl=value;

}

}

publicstringPageControl

{

get

{

returnpageControl;

}

set

{

pageControl=value;

}

}

//当需要载入多个UserControl时,可以直接调用LoadUserControl

//当只需要载入一个UserControl时,可以调用Clear清除载入过的内容

publicvoidClear()

{

this.Controls.Clear();

}

//载入UserControl目录下的.ascx

//以及导入对应的css文件

publicvoidLoadUserControl(stringUserControl)

{

this.userControl=UserControl;

BasePagepage=(BasePage)this.Page;

//请参考后面的BasePage的代码

Controlcontrol=this.Page.LoadControl(

page.Scheme+"usercontrol/"+userControl+".ascx");

stringcss="css/"+userControl+".css";

//对应的css文件

if(File.Exists(this.Page.MapPath(page.Scheme+css)))

{

page.AddCss(page.Scheme+css);

}

this.Controls.Add(control);

}

//载入Page目录下的.ascx

//LoadPage与LoadUserControl的区别是两者载入的.ascx所在的目录不同

//Page目录下的.ascx可以看成是一些搭建主体结构的.ascx,其使用MyPlaceHolder

//来包含最基础的积木块.ascx(在UserControl目录下)

publicvoidLoadPage(stringPageControl)

{

this.PageControl=PageControl;

BasePagepage=(BasePage)this.Page;

Controlcontrol=this.Page.LoadControl(

page.Scheme+"page/"+pageControl+".ascx");

stringcss="css/"+pageControl+".css";

if(File.Exists(this.Page.MapPath(page.Scheme+css)))

{

page.AddCss(page.Scheme+css);

}

this.Controls.Add(control);

}

protectedoverridevoidOnLoad(EventArgse)

{

base.OnLoad(e);

if(!

userControl.Equals(string.Empty))

{

LoadUserControl(userControl);

}

}

}

使用方法:

MyPlaceHolder

id="Myplaceholder1"

runat="server"

UserControl="Header">

MyPlaceHolder>

//这里的Header是位于UserControl目录下的Header.ascx

4.构建主要的建筑结构——PageTemplate.ascx

PageTemplate其实也是一个UserControl,只不过其功能是用来包含其他的UserControl积木,在PageTemplate里,可以定义页面的整体布局。

比如:

Header、Footer在整个页面中的位置,页面主体区域的位置等等。

更重要的是,PageTemplate中应该包含Form的定义,这是所需要的不可缺少的服务器控件。

<%@RegisterTagPrefix="HomeOffice"

Namespace="HomeOffice.Web.UI.WebControl"

Assembly="HomeOffice.Web.UI"%>

DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">

构建积木式应用程序

LiteralID="CssHolder"runat="server">

Literal>

LiteralID="ScriptHolder"Runat="server">

Literal>

enctype="multipart/form-data">

 

MyPlaceHolderid="PlaceHolder1"

runat="server"UserControl="Header">

MyPlaceHolder>

MyPlaceHolderid="Myplaceholder1"

runat="server"UserControl="MainMenu">

MyPlaceHolder>

6px;background:

#f6f6f6;font-size:

1px;

border-top:

1pxsolidwhite;"> 

4px;background:

#e1e1e1;font-size:

1px;

border-top:

1pxsolid#e6e6e6;"> 

white;border-bottom:

1pxsolid#bbbbbb">

MyPlaceHolderid="PageBody"runat="server">

MyPlaceHolder>

20px">

MyPlaceHolderid="Myplaceholder2"

runat="server"UserControl="Footer">

MyPlaceHolder>

 

在这个PageTemplate中,我们可以看到使用了4个MyPlaceHolder来载入积木块,除了PageBody这个外,其他的都载入了位于UserControl目录下最基本的积木块。

而PageBody的作用则是根据http所请求的页面不同载入Page目录下不同的页面。

这些其对应的cs代码在BasePage中处理。

publicclassBasePage:

Page

{

publicstringScheme="/Scheme/blue/";//所采用的主题

publicAppSettingSetting;

//环境配置,在Init中分析,其内容包括解析http请求到正确的Page目录下的

//文件,建立当前登陆用户的信息

publicControlfocusControl;//当页面载入后,首先获得焦点的控件

privateLiteralCssHolder;//要导入的css

privateLiteralScriptHolder;//要导入的script文件

publicBasePage()

{

focusControl=null;

}

//导入css文件引用

publicvoidAddScript(stringscript)

{

//进行IsPostBack判断的原因是

//防止重复导入

if(!

this.IsPostBack)

{

ScriptHolder.Text+=string.Format("

type=\"text/javascript\">\n",script);

}

}

//导入script文件引用

publicvoidAddCss(stringcss)

{

if(!

this.IsPostBack)

{

CssHolder.Text+="

type=\"text/css\"href=\""+css+"\">\n";

}

}

//载入http请求分析后的Page目录下的所请求的文件

publicvoidLoadPageTemplate()

{

Controlcontrol=(Control)this.LoadControl

(this.Scheme+"PageTemplate.ascx");

CssHolder=(Literal)control.FindControl("CssHolder");

ScriptHolder=(Literal)control.FindControl("ScriptHolder");

this.Controls.Add(control);

MyPlaceHolderbody=(MyPlaceHolder)

control.FindControl("PageBody");

body.LoadPage(this.Setting.TargetPage);

//调用MyPlaceHolder的LoadPage方法

//TargetPage记录了请求的页面

}

protectedoverridevoidOnInit(EventArgse)

{

base.OnInit(e);

//分析http请求

Setting=newAppSetting(this.Request.Path);

//设置用户信息

if(this.Request.IsAuthenticated)

{

Setting.SetUser(User.Identity.Name);

}

}

protectedoverridevoidOnLoad(EventArgse)

{

base.OnLoad(e);

this.LoadPageTemplate();

}

//当页面显示后,初始获得焦点的控件

protectedvoidSetFocusControl()

{

if(this.focusControl==null)return;

stringtemplate=@"

document.all.{0}.focus();";

stringscript=string.Format(template,

this.focusControl.ClientID);

this.RegisterStartupScript("FocusControl",script);

}

protectedoverridevoidOnPreRender(EventArgse)

{

base.OnPreRender(e);

SetFocusControl();

}

//修复了1.1的一个bug

//没有这段代码,LinkButton等某些服务器将无法使用

protectedoverridevoidRender(HtmlTextWriterwriter)

{

StringBuilderstringBuilder=newStringBuilder();

StringWriterstringWriter=newStringWriter(stringBuilder);

HtmlTextWriterhtmlWriter=newHtmlTextWriter(stringWriter);

base.Render(htmlWriter);

stringhtml=stringBuilder.ToString();

intstart=html.IndexOf("

intend=html.IndexOf("\"",start);

stringformID=html.Substring(start,end-start);

stringreplace=formID.Replace(":

","_");

html=html.Replace("document."+formID,"document."+replace);

writer.Write(html);

}

}

BasePage中的一个非常重要的成员变量Setting,其作用是保存分析http请求后的结果。

由于采用积木式应用,用户所请求的aspx文件在硬盘上并不存在,需要把用户的这种http请求解析成Page目录下的某个ascx文件,让BasePage载入。

5、采用HttpHandler截获http请求

有了这些基础性的东西之后,我们就应该使用FrontContrller模式来控制所请求的aspx文件,再把这些请求的文件导向正确的UserControl积木。

.NETframework中的Page继承了IhttpHandler,因此我们可以对aspx的解析就让BasePage来处理,这样BasePage在分析了http请求之后,会载入PageTemplate,然后再根据所请求的页面载入不同的UserControl积木。

在web.config中进行如下配置,让httphandler生效:

我们在这里不是直接使用了HttpHandler,而是采用了HttpHandlerFactory,不过所使用的代码也非常简单

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1