CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
posts - 37, comments - 232, trackbacks - 10, articles - 0
  博客园 :: 首页 ::  :: 联系 :: 订阅 订阅 :: 管理

一、起因:    
     开发团队的一名开发人员突然离职,他把他负责的模块任务交给了我。其中一个模块是他写了一个用户控件,我在我的页面尚始终都用不起,运行时发生错误,错误消息是:The base class includes the field *****, but its type (****) is not compatible with the type of control (ASP.webusercontrol_ascx).
 
二、经过:
    遇到这个问题后个人感觉那个用户控件在页面上注册没有成功。查找了页面注册代码:

<%@ Register Src="ProjectInfo.ascx" TagName="ProjectInfo" TagPrefix="uc3" %>
<uc3:ProjectInfo ID="ProjectInfo1" runat="server" />

通过反复的查找都发现这个代码没有问题,我也查找以前的用户控件页是这样注册的。那到底是那儿出了问题了呢?功夫不负有心人,终于找到问题所在了,用户控件的申明是这样写的

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ProjectInfo.ascx.cs" Inherits="ProjectInfo" %>

问题就在那CodeFile,由于所在的项目是Web Application应用程序,申明的用户控件应该是CodeBehind,怎么回变成CodeFile呢?终于找到问题所在了。当我把CodeFile修改成CodeBehind后页面就能正常显示了。那这儿被谁谁修改成CodeBehind了。通过查看VSTS修改历史,没有人对这个文件进行修改,当时增加这个文件的时候就已经是CodeFile了。Web Application默认增加的用户控件都是CodeBehind的。除非不是Web Application,当时我就建立的一个web site站点,就添加了一个用户控件,一看果然是这样什么的:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ProjectInfo.ascx.cs" Inherits="ProjectInfo" %>

 问题的来源页找到了,原来这个用户控件是通过Web Site站点添加的移植过来的而引起的。谢谢上帝,终于把这个问题解决了。
三、思考
问题找到了。问题的来源页找到了。那么为什么这里用CodeFile就不行了。这个才是问题实质。为什么Web Application申明的控件或者页面都是用CodeBehind而不是用CodeFile来申明?
四、 结果
通过不断的查找原因,终于把Web Application用CodeBehind而Web Site用CodeFile找到了?
原来Web Application和Web Site的编译机制是不同的。
Web Site:当我们使用VS.net创建一个页面的时候,VS会自动的创建一个CodeBehind文件,但是当我们编译站点的时候,VS.net会自动的根据页面文件的内容,生成一个临时的Partial类,然后把这个partial类和CodeBehind中的partial类整合编译,最后生成一个位于bin中的dll文件。(CodeFile来实现)
Web Application:当我们在页面上加入一个新的控件时候,VS.net自动会在 CodeBehind代码中增加一个Protected对象的申明(Partial类),并在代码中使用和操作这个对象,VS.net会时刻维护页面文件的控件与 (Partial类代码文件的申明)之间同步。当我们编译站点时,VS.net将所以CodeBehind文件编译在一起,生成一个位于bin目录中的dll文件。(CodeBehind来实现)

通过上面的比较后,我们现在已经是比较明白上面的用户控件申明应该用CodeBehind而不能用CodeFile。其根本原因就是:Web Application的页面用的是CodeBehind的方式,如果里面的用户控件又用CodeFile的方式来编译的化,就出现矛盾,那么页面就优先于用户控件的方式,直接把所有的代码文件编译成dll文件就可,而不是把页面文件生成一个partial类再和代码文件一起编译。因此那样的话页面的用户控件将不会被VS.net根据页面的内容生成一个临时类和CodeBehind中的Partial类整合编译,缺少对用户控件的申明,从而会出现:The base class includes the field *****, but its type (****) is not compatible with the type of control (ASP.webusercontrol_ascx).

Feedback

#1楼    回复  引用  查看    

2008-06-27 14:21 by willieQ      
学习~~~~~~

#2楼    回复  引用  查看    

2008-06-27 14:44 by Jimmy Zhang      
编译的时候页面不是生成在 Bin目录吧,是将所有页面生成各自的文件放在这个目录下 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\

#3楼    回复  引用    

2008-06-27 15:16 by hyper [未注册用户]
第一遍,没看懂,感觉楼主的理解还不透彻

#4楼 [楼主]   回复  引用  查看    

2008-06-27 15:23 by Charles Chen      
希望高手提出意见,补充和修正不准确的地方。谢谢。

#5楼    回复  引用    

2008-06-27 16:26 by 0350 [未注册用户]
http://blog.joycode.com/ghj/archive/2006/07/19/78906.aspx

#6楼    回复  引用  查看    

2008-06-27 18:27 by 陈晨      
Web Site和Web Application项目究竟哪个更适合Web项目呢,两者有什么差别?谢谢

#7楼    回复  引用  查看    

2008-06-27 21:20 by 一味      
@陈晨
我一直用的web application。
web site的所有类都放在app_code里面,不爽。
web site的类默认没有命名空间,不爽。
web site不能支持nunit单元测试,不爽中的不爽。

#8楼    回复  引用  查看    

2008-06-28 10:32 by 金色海洋(jyk)      
都怪vs2005弄出来的 web site弄得这么乱。

#9楼    回复  引用  查看    

2008-06-28 11:38 by 王孟军!      
根源应该是两者的编译方式不同,至于具体流程,没有仔细研究过,呵呵

#10楼 [楼主]   回复  引用  查看    

2008-07-02 09:05 by Charles Chen      
我也喜欢用Web Application,而VS2003目录的风格保持一致。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-16 09:35 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: