ASP.NET 2.0中小心Profile命名冲突

     昨天打算将 博客园论坛程序迁移到ASP.NET 2.0,博客园论坛用的是宝玉汉化的Asp.net Forums2.0 RC2,参考 Upgrading VS 2003 Web Projects to be VS 2005 Web Application Projects 将项目从VS 2003迁移到VS 2005中并成功编译。可是在运行时,却出现编译错误,详细错误信息如下:
    
Compilation Error 
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0102: The type 'ASP.themes_default_skins_skin_navigationmenu_ascx' already contains a definition for 'Profile'

Source Error: 

Line 207:        }
Line 208:        
Line 209:        protected System.Web.Profile.DefaultProfile Profile {
Line 210:            get {
Line 211:                return ((System.Web.Profile.DefaultProfile)(this.Context.Profile)); 

Source File: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\forums\9ef6037b\2a750bf2\App_Web_skin-navigationmenu.ascx.4f634227.fnkdfznr.0.cs    Line: 209

     打开App_Web_skin-navigationmenu.ascx.4f634227.fnkdfznr.0.cs的代码检查了一下,发现有两处地方定义了Profile:
    
protected  global::AspNetForums.Controls.ForumAnchor Profile;

protected  System.Web.Profile.DefaultProfile Profile  {
            
get {
                
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
            }

        }


     显然错误就来自Profile的重复定义。
     App_Web_skin-navigationmenu.ascx.4f634227.fnkdfznr.0.cs是由ASP.NET 2.0运行时动态编译Web\Themes\default\Skins\Skin-NavigationMenu.ascx生成的文件,所以我们需要进一步查看Skin-NavigationMenu.ascx,原来在Skin-NavigationMenu.ascx中定义了一个id为“Profile”的控件:
    
< forums:ForumAnchor  class ="menuLink"  runat ="server"  Visible ="false"  id ="Profile"  AnchorType ="MenuEditProfile"   />

     于是, 动态编译生产的代码中就有protected global::AspNetForums.Controls.ForumAnchor Profile;的定义。
     而ASP.NET 2.0为了支持Profile功能,编译时在产生的代码中也增加了一个System.Web.Profile.DefaultProfile Profile的定义,从而引起了这个问题。
     所以,在ASP.NET 2.0的页面或用户控件代码中,不要使用Profile变量名,以免引起命名冲突从而产生运行时错误,在编译时VS 2005也不会给你任何提示。
     对于我这里遇到的问题,我采取的处理方法是在Skin-NavigationMenu.ascx中加上CompilationMode="Never"。也就是: <%@ Control Language="C#" CompilationMode="Never"%>,这样就不让ASP.NET 2.0运行时对这个文件进行动态编译,因为Skin-NavigationMenu.ascx中没有代码,也没有code behind文件,不然的话就要对Profile改名,但这会影响其他地方的代码。
     我觉得这里也是ASP.NET 2.0的美中不足之处,如果设计时考虑到这一点,起一个不容易重复的名称,当然更好的是在动态编译时自动检测这个命名冲突,并对冲突的命名进行处理,那就锦上添花了。设计之美不仅表现在架构等高层次的地方,更体现于这些细微之处。
     在网上搜索这个问题,大多数的回答都是认为是asp.net forum与asp.net 2.0不兼容性,也就认为asp.net forum不能运作在asp.net 2.0上。写到这的时候,我进行了简单的测试,不在.NET 2.0中对Asp.net Forums2.0 RC2进行编译,直接让ASP.NET 1.1版的Asp.net Forums2.0 RC2运行在ASP.NET 2.0上,并解决上面说明的问题,测试的结果是可以正常运行,我只是简单测试:用户登录、发表文章、回复文章。没有进一步测试,不知是否有其他问题。有兴趣的朋友可以进一步测试。

你可能感兴趣的:(asp.net)