前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20110612 DiscuzNT代码研

20110612 DiscuzNT代码研

作者头像
py3study
发布2020-01-08 17:26:57
1.1K0
发布2020-01-08 17:26:57
举报
文章被收录于专栏:python3python3

20110612 DiscuzNT代码研究(3)

1. 说明

本文主要讨论

1) ASP.NET的页面隐藏模型

2) 通过页面隐藏模型重写Discuz.Web-install-index.aspx页面

2. Asp.Net页面隐藏模式 2.1. 创建index_cfq.aspx的Web窗体页面

选择install文件夹à右键à选择“添加-新建项”à选择“Web窗体”,输入“index_cfq.aspx”

clip_image002[4]
clip_image002[4]
clip_image004[4]
clip_image004[4]

2.2. index_cfq.aspx页面代码

clip_image006[4]
clip_image006[4]

我们主要关注第1行,第一行说明:

1) 本页面采用的语言“C#”

2) 本页面的事件采用自动匹配:AutoEvenWireUp=”True”

3) 本页面采用代码隐藏模型:CodeBehind=”index_cfq.asp.cs”

4) 本页面编译时生成的类将继承Discuz.Web.install.index_cfq

2.3. @Page指令的AutoEvenWireUp属性

AutoEvenWireUp属性用于指示“页面的事件是否自动匹配”。

当AutoEvenWireUp=true时,表示页面启动事件自动匹配。

2.3.1. 事件类型

这里我们谈到事件,我们把事件适当区分一下:

1) 页事件:即Page页面的事件

2) 控件事件:即控件上的事件,比如aspx页面上有个Button控件,那么Button控件的事件成为控件事件。

AutoEvenWireUp是针对页事件而言的。

2.3.2. 事件与方法的绑定

事件与事件处理方法的绑定,在.NET中是通过“委托”实现的,在ASP.NET中,有几种方式可以绑定事件方法。

1) 委托:在C#代码中实现

this.button1.Click += new System.EventHandler(this.button1_Click);

2) 控件标记

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

3) 基于方法命名约定的方法

一般指页事件的方法,这种绑定需要设置AutoEvenWireUp=true,其他地方不用指定方法与事件的关联,系统会自动查找按照“命名约定的方法”(Page_事件名称),然后即可启动事件。当然方法的参数必须与事件委托一致。

protected void Page_Load(object sender, EventArgs e)

2.4. 关于页面隐藏模型

先看看下图,当然下图不是标准的UML图,只是为了解释一下而已。

本图是在页面隐藏模型下在Web服务器编译后的类图信息。

clip_image008[4]
clip_image008[4]

可以通过VS的类视图可以看得比较清楚

clip_image010[4]
clip_image010[4]

我们对整个过程稍微介绍一下。

当我们建立一个index_cfq的web窗体,VS自动帮忙创建了几个文件:

1) index_cfq.aspx

2) index_cfq.aspx.cs(index_cfq.aspx.designer.cs)

n index_cfq.aspx

主要是aspx页面信息,可以包括C#代码,服务器控件信息,HTML标记,CSS,JavaScript等等内容。

clip_image012[4]
clip_image012[4]

n index_cfq.aspx.cs(index_cfq.aspx.designer.cs)

index_cfq.aspx.cs主要放一些C#源代码,一般是一些方法,当然还可以有很多内容弄个,但是不包含aspx页面上的服务器控件定义信息(在index_cfq.aspx.designer.cs定义)。

clip_image014[4]
clip_image014[4]

其中index_cfq.aspx.designer.cs主要是放一些服务器控件的定义内容。

clip_image016[4]
clip_image016[4]

其中index_cfq.aspx文件编译后,实际上会产生两个类,一个是index_cfq的部分类,与index_cfq.aspx.cs文件编译后产生的index_cfq部分类一起构成index_cfq完整类。

clip_image018[4]
clip_image018[4]

同时index_cfq.aspx还产生一个类,即index_cfq_aspx类,此类继承自index_cfq类,这也是

clip_image020[4]
clip_image020[4]

中指定 Inherites="Discuz.Web.install.index_cfq"继承的意思。

如果把Inherites="Discuz.Web.install.index_cfq"改为

Inherites="Discuz.Web.install.index_cfq_cfq",则在运行时会提示如下错误:

clip_image022[4]
clip_image022[4]

然后观察类视图,即会发现,实际上系统仍自动创建一个index_cfq_cfq的类,只是这个类因为在其他页面没有指定继承Page,所以默认继承Object,但是对于ASP.NET页面必须继承Page,所以在运行提示错误,说明该类型不是继承与Page的错误。

clip_image024[4]
clip_image024[4]

然后我们Inherites="Discuz.Web.install.index_cfq"该回来,

然后把CodeBehind="index_cfq.aspx.cs"删除或者改为

CodeBehind="index_cfq_cfq.aspx.cs"

浏览程序,这是我们发现程序正常运行。

也就是说,实际上当我们编译了dll文件了,实际上我们可以不用CodeBehind这个东西,我们直接用Inherites指名我们要继承的类即可。

我再做一个实验。

1) 把“index_cfq.aspx.cs”改名为“index_cfq_cfq.aspx.cs”

2) 把“index_cfq.aspx.designer.cs”改名为“index_cfq_cfq.aspx.designer.cs”

这是会发现以下现象:

1) index_cfq_cfq.aspx.designer.cs自动关联到index_cfq_cfq.aspx.cs。这个应该是VS的机制。

2) index_cfq.aspx底下的两个文件会感叹号,可以删除了,所以下面图看不到。

之所有有感叹号,是因为在项目中有包含此两个文件,但是实际文件已经不存在了,所以提示感叹号。

clip_image026[4]
clip_image026[4]

然后选择那两文件,包含到项目中。

clip_image028[4]
clip_image028[4]

然后重新生成网站,运行index_cfq.aspx,正常!

这里需要注意两个细节: 1) 如果以上两文件为包含到项目中,则无法正常运行,会提示类不存在。 2) 如果未包含文件,但是通过CodeFile指定CS文件,也是可以运行的,但是发布网站时,必须一同发布源代码哦!(用CodeBehind也是不行的)

3. 修改index.aspx页面为页面隐藏模式

既然我们立即了页面隐藏模式的原理,我们现在尝试把index.aspx页面修改为页面隐藏模式。

1) 建立一个index.aspx.cs文件,在其中创建一个index的类

clip_image030[4]
clip_image030[4]

2) 然后把<script></script>的代码搬移过来(可以不删除index中的代码,注释掉即可)。

3) 在index.aspx.cs文件的Page指令中添加如下内容:

clip_image032[4]
clip_image032[4]

4) 注释掉“Page_Lode”方法中的页面跳转代码,以便测试

clip_image034[4]
clip_image034[4]

5) 经过测试,调试成功。

clip_image036[4]
clip_image036[4]

(本文结束)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Discuz!
Discuz! 是全球领先的论坛社区应用系统,自2001年6月面世以来,服务超过300多万网站用户案例。现在,借助 Discuz! ,您不仅可以使用搭建传统的社区论坛,更可轻易的构建面向移动互联网时代的私域流量和社交圈子类的应用,并快速启动业务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档