RSS 2.0 Feed
2003-12 Entries
摘要:再过几个小时就是2004年了,我的生日恰巧是1月1日,呵呵,所以每到元旦,长大一岁的感觉就特别强烈了。今天在办公室把SharePoint服务器端的用于文件接收的WebService写完了,然后在自己写的客户端上试着调用了一下,传了几个文件到SharePoint服务器的文档库里面,呵呵,速度还不错。下一步就是把“续传”的功能加上,就是说,上传的过程中断线、出错,下次上传的时候文件可以从断掉的地方续传。我怀疑这种上传方式的速度肯定比不上普通的文件上传,但是续传的功能对于大文件的上传又很重要。有时候想起自己写Blog的目的,可能是因为“写作是最好的记忆”吧,觉得看到了什么好玩的东东写下来可能就不会很快的忘掉。平时总有很多东西都想写下来,但写作的确和心情很有关系,而且人总是懒惰的。今天下班的时候,部门里面两个玩得不错的PLMM跑出去到Baleno买了件衣服,然后回办公室送给了我。所以心情比较愉快。希望2004好心情能一直陪伴我。...[阅读全文]

posted @ | Feedback (6) |

摘要:1、Pre-Compilation in WhidbeyASP.NET一大特色就是Dynamic Compilation,但是有些场合Pre-Compilation却是更好的选择,比如,你不想访问你的站点的第一个用户痴痴的等待,或者你根本不想把任何源码(包括HTML的内容)给你的用户。Pre-Compilation在ASP.NET 2.0中支持得很彻底,你可以选择In-Place Pre-Compilation,只需要你访问一下:http://站点名称/WebApp名称/PreCompile.axd系统就会将WebApp里面所有的页面先给你编译一遍。或者,更加彻底的方式,PreCompilation for Deployment,.Net Framework 2.0提供了一个命令行的工具(aspnet_compiler.exe),让你将WebApp中所有的代码、页面(包括HTML)、静态文件全部编译进dll,然后给你一个“Deployment-Ready WebApp”,No Code、No Html,呵呵,但是浏览起来和普通的WebApp没有区别。这篇文章包含了更多的信息。2、Pre-Compilation and Keep-Alive in .NET Framework 1.1Whidbey毕竟是明年的事,其实在现在,我们也可以想一些办法。Global.asax里面的那个Global类是继承自HttpApplication的,我们可以自己插入一个中间层,来做一些自己的事情。比如我们创建一个PreGlobal类,继承自HttpApplication,在PreGlobar.Init()方法中,创建一个新的线程,让这个线程遍历访问WebApp中所有的.aspx和.ascx(对ascx就LoadControl(),对aspx就HttpWebRequest.Create(url).GetResponse()),这样可以实现我们自己的“Pre-Compilation”,然后再让Global继承自我们自己的这个PreGlobal就可以了。我们可以感觉到,如果一段时间没有访问WebApp,那么当再次访问时,速度大大降低,这是因为Clr会自动将站点的Assembly从内存中Unload,当再次访问时,再载入Assembly,而这个动作是相当耗时的(想想在电脑上运行一个WinForm,它的启动时间)。我们需要想一个办法让我们的WebApp始终Keep-Alive,这样Clr就不会将它Unload了。方法还是PreGlobal.Init()方法,我们在这个方法中创建一个Timer对象,定时时间小于默认的Session过期时间即可,在其Elapsed事件中调用一下“HttpWebRequest.Create(站点url).GetResponse()”就可以让我们的站点始终Alive了。这个方法是从ASPAliance上看来的,具体出处已经找不到了。3、Delphi8D8的文章在CSDN上也渐渐多了起来。如果不讨厌Pascal的语法,那么D8安装目录的source目录下的文件实在是一个不错的学习.NET的资源,里面有D8的RTL、VCL.NET、Indy.NET、Web数据感知控件实现的源码,至少可以看看D8是如何将它的东西和.NET的东西结合起来的。比如,在Borland.Delphi.System.pas里面,我看到了TObject = System.Object,呵呵,和我们想象的一样。在Borland.Vcl.Classes.pas里面,我看到了TList有一个private成员FList是System.Collections.ArrayList类型的,于是显然TList是通过聚合ArrayList来实现的。而在Borland.Vcl.Forms.pas里面,可以看到TForm是从TCustomForm继承下来,然后上面依次是TScrollingWinControl、TWinControl、TControl...和System.Windows.Forms.Form没什么关系,这也就是D8要分VCL.NET App和Win App的原因,VCL.NET很多控件仍然是Borland按自己的方式写的(虽然都是Managed Code写的),他们和WinForms不一定完全兼容的。...[阅读全文]

posted @ | Feedback (4) |

摘要:昨晚把Delphi8安装上并试用了一下,Delphi8是一个完全面向.NET平台的开发工具,而Win32平台仍然由Delphi7支撑,明年还将发布Delphi 7.1。就是说,Delphi7和Delphi8将成为两条平行的产品线。当然随着Win32市场的逐渐缩小,Delphi7不会再有后续的继承版本。下面是我的第一印象:1、Delphi8很耗内存,和VS.NET不相上下,但是编译速度快不少。安装目录是BDS\2.0,而C# Builder是BDS\1.0,而且Delphi8运行的进程里面也是那个相同的“bds.exe”。可以想象Delphi8和C#Builder共用的一个IDE,不知道以后会不会把他们两个集成起来。他们的界面也是非常非常相似的。2、新建立了一个Web Application,同样的Code-Behind,只不过后台文件是.pas了,和VS的没什么两样,编译,浏览,然后去“Temporary ASP.NET Files”目录下面看生成的编译后的临时文件,果然仍然也是从.aspx生成.cs的C#代码文件,然后编译成dll。Delphi8只是将.pas代码文件编译成dll,然后通过继承让页面文件使用。从这个观点看Delphi8的ASP.NET设计,和其他语言Effiel、Python的VS插件所做的没太多区别。3、打开.aspx的html视图,顶上仍然是那句“Page language="c#"”,试着在.aspx里面手工写上一个C#语法的函数,然后在下面Form的OnLoad中调用,没任何问题。更加证实了上面第2点所说的。4、Delphi8新增的一些控件:BDP(Borland Data Provider,一组符合ADO.NET接口的数据提供组件,号称性能更好)、Web数据感知控件(Delphi的老传统,通过一个DBWebDataSource,将数据直接映射到DBWebLabel、DBWebListBox之类的控件上)、ECO(Enterprise Core Objects,Borland力推的一组MDA架构的组件,这个应该是重头戏,可Delphi产品网页上的ECO Tutorial居然还是“come soon...”,晕)。Delphi8面对的挑战不小,基于.Net Framework 1.2的Whidbey明年春季就会发布beta了,而且VS的稳定性显然胜过Delphi8(Delphi8的IDE稳定性的确是个问题,我用了一阵子之后,代码提示就莫名其妙的不起作用了)。我觉得Borland不要再花费力气去搞什么C# Builder(显然C#程序员几乎都会选择VC#),认真的将Delphi8做得更加稳定、更具弹性,将Pascal语言的编译器做得速度更快更有效率。显然Delphi8的后续开发还在紧张进行(在C# Builder中出现过的可以引用J2EE Components的功能好像在Delphi8中还没有实现,不少论坛上都引用了李维的话,说Delphi Team过完圣诞就得加班)。希望Borland能带给我们一个优秀的.NET开发工具。...[阅读全文]

posted @ | Feedback (29) |

摘要:在2004年春天发布的Whidbey beta中的ASP.NET 2.0,将增加一个特性,可以将Output Cache写到硬盘或者数据库中。这样我们可以将缓存在磁盘上保留很长一段时间,并且当后台数据变化后自动重新生成缓存。并且缓存也不再会因为工作进程的重启而消失。我们甚至可以设定使用多大的磁盘空间来放置缓存内容。但是,Whidbey不会提供类似于支持Session的State Server一样的集中式的缓存服务器(这个特性对于服务器集群很有利),ASP.NET小组推荐在各个服务器上保留不同的缓存实例,而且他们认为这种模式的缓存的性能也会大打折扣。这里是一篇很不错的介绍Longhorn三个主要编程模型Avalon、WinFS、Indigo的文章。其中对WinFS介绍了很多。其中提到在Longhorn PDC预览版本中,WinFS并未完成,在beta 1中将完成基础模型,在beta 2中将基本完成。而PDC预览中Indigo完成度就比较高了,而且微软也承诺在WinXP和Win2003中提供Indigo技术的实现,而且最终版的Longhorn里面,Indigo Message Server之间也没有信息交换的能力。(Otherwise, the release version of the Longhorn client wouldn't have Indigo-compliant servers with which to trade messages. 难道我理解错了??)相对于现在创建WebService的简单性来说,Indigo也存在一个比较陡的学习曲线。(但Microsoft也在致力改善)文章最后的两句话很有指导性。If you want a shorter-term payoff for the time you invest in exploring Longhorn, concentrate on Indigo's MessageBus. Otherwise, make the effort to gain an equal working knowledge of all three pillars. If Microsoft's bet on Longhorn pays off, you'll be amply rewarded by the demand for competent Longhorn programmers. 如果你想马上从学习Longhorn编程模型中获益,那么就先学习Indigo,但是如果努力学习所有的这三个主要编程模型,一旦微软在Longhorn上的赌注兑现,那么你将从对Longhorn程序员的需求中大大获益。...[阅读全文]

posted @ | Feedback (0) |

摘要:在C# 2.0中:public class StringList : System.Collection.Generic.List<String> {}类似的,我们可以直接创建出符合我们要求的IntList、UserControlList,呵呵。...[阅读全文]

posted @ | Feedback (0) |

摘要:话说公元2003年12月17日,MSDN Library网站上悄无声息的多了一篇文章,介绍了关于构建一个PlugIn Framework的一些基础知识,于是,有了这篇随笔… PlugIn,很COOL的特性,下面将演示如何给我们的IBuySpy定制一个Page Start PlugIn,这个PlugIn可以让用户自己来创建PlugIn,嵌入到IBuySpy的Page Start PlugIn里面,在网站页面载入的时候,会执行用户嵌入的PlugIn。 可我们为什么要给IBuySpy创建PlugIn接口呢?我们要实现同样的功能,可以直接的修改它的代码,岂不是直接很多?原因:IBuySpy只是用来演示PlugIn的,你可以把同样的技术应用到其他的WebForm甚至WinForm,而它们可能并不会像IBuySpy一样是免费的,我们交付的产品里面不会附上代码,如果我们提供了PlugIn的接口,无疑会让我们的产品更加具有扩展性。何况很多功能可能可以直接作成PlugIn来嵌入到原有的系统中,这个时候无需再改动原有的代码,再去编译它。 1、构建IBuySpy的PlugIn所需的接口,这些接口就是可以公开给用户代码的: 首先需要的是一个通用的IPlugIn接口,所有具体的插件将实现这个接口: namespace ASPNetPortal.PlugIns {  public interface IPlugIn {  String Name {get;}  String Version {get;}  void DoAction(IPlugInArgs args);     }} 这个接口有三个成员:Name属性,公开插件的名称Version属性,公开插件的版本DoAction()方法,执行插件要做的操作,这个方法还有一个IPlugInArgs的参数,需要传递给方法所参数可以通过它传递出去。 然后就是这个IPlugInArgs接口: namespace ASPNetPortal.PlugIns {  public interface IPlugInArgs {   System.Web.HttpContext Context {get;}  Object Data {get;} }} 它有两个成员:Context属性,一个HttpContext类型的对象,如果我们要让插件能够在页面上做些事,不给它HttpContext肯定不行。Data属性,一个Object类型的对象,预留的,什么地方需要就什么地方用上。 接着是一个接口集合类: namespace ASPNetPortal.PlugIns {  public class PlugInCollection : CollectionBase {   public Int32 Add(IPlugIn plugIn) {   return this.List.Add(plugIn);  }   public IPlugIn this[Int32 index] {   get {    return (IPlugIn) this.List[index];   }  } }} 很简单明了。用户可能不止嵌入一个插件。 PlugIn也可以有很多类型,比如我们这里要实现的Page Start PlugIn,是一个在页面载入的时候可以让嵌入的PlugIn执行的。当然你也可以创建各种类型的PlugIn。 namespace ASPNetPortal.PlugIns {  public interface IPageStartPlugIn : IPlugIn {}} 这个PlugIn接口不需要再做任何事,直接继承IPlugIn就可以了。 2、修改IBuySpy,让它支持执行PlugIn: 根据我们的需求,我们创建一个实际的插件参数类,这个类继承自IPlugInArgs: namespace ASPNetPortal.PlugIns {  public class PlugInArgs : IPlugInArgs {  private System.Web.HttpContext _context;  private Object _data;   public PlugInArgs(System.Web.HttpContext context, Object data) {   _context = context;   _data = data;  }   public System.Web.HttpContext Context {   get {    return _context;   }  }   public Object Data {   get {    return _data;   }  } }} 我们需要地方来标示用户嵌入的PlugIn的列表,我们放在web.config里面的里面,我们加上一项,来表示我们要添上的Page Start PlugIn: 《ADD key="PageStartPlugIns" value="" /》 value里面可以写入嵌入的PlugIn的列表,格式像这样:Value = "插件一的类名, 插件一的程序集名; 插件二的类名, 插件二的程序集名" 然后,我们构建一个PlugInHelper类,来执行获取PlugIn、执行PlugIn的操作: namespace ASPNetPortal.PlugIns {  public class PlugInHelper {  private......[阅读全文]

posted @ | Feedback (0) |

摘要:ASP.NET在页面的Context.User里面放了一个实现IPrincipal的对象,用来实现对已验证用户的管理。ASP.NET系统中,通常采用的方式就是扩展这个Context.User,让它里面保存定制的信息。   1、扩展方式 扩展方式基本上有两种:直接利用GenericPrincipal和自己写一个实现IPrincipal的类。IBuySpy用的前者,优点就是N简单。   Context.User = new GenericPrincipal(Context.User.Identity, roles);   roles是一个保存了当前用户的角色信息的String,各个角色间用“;”分隔,由前面的代码调用数据层中的UserDB.GetRoles()方法来得到。   自己写一个实现IPrincipal的类其实也是N简单,你只需要实现两个接口:Identity属性返回一个IIdentity的用户标识对象,IsInRole(String role)判断用户是否具有参数中的角色。下面是我写的一个替代IBuySpy中原有扩展模式的类:     public class IBSPrincipal : IPrincipal {   private IIdentity _identity; private String[] _asRole;   下面是两个构造函数:   public IBSPrincipal(IIdentity identity, String roles) { _identity = identity; _asRole = roles.Split(';'); }   public IBSPrincipal(IIdentity identity, String[] roles) { _identity = identity; _asRole = roles; }   然后是用来实现IPrincipal的一个属性和一个方法:   public IIdentity Identity { get { return _identity; } }   public bool IsInRole(string role) {     // 下面一行幸得“JGTM'2003”告知Array有一个static的IndexOf()     // 原来是用循环查询_asRole....土不可及...     return (System.Array.IndexOf(_asRole, role) > -1); }   OK,然后我们就可以用下面这句替代上面IBuySpy原有的那句了:   Context.User = new IBSPrincipal(Context.User.Identity, roles);   看起来好像自己创建这个IBSPrincipal并不划算,它没有提供比GenericPrincipal更多的功能,但好处是我们以后可以随时扩展它,而且实现的成本也很低。   2、时机 我们在什么时候进行上面所说的这样的扩展行为呢?   IBuySpy选择在Global.asax里面的Application_AuthenticateRequest事件里面进行这些动作,只要ASP.NET程序需要进行用户验证,那么肯定要经过这里,这个地方不错。   另一个好地方就是在“页面基类”的Page_Init方法中,我们在构造网站的时候就可以先构建一个“页面基类”(即使一开始里面什么都没有),所有的页面都从这个基类继承下来而不是从默认的System.Web.UI.Page,这样做的好处是我们可以随时把类似的动作放在基类中。可惜IBuySpy本身并没有应用这种“页面基类”的方式。   3、FormsAuthenticationTicket 这个类是一个“验证票据”类,我们可以利用这个票据来保存用户的信息,并把这个票据写到客户端的Cookie里面,以后客户再来时,从Cookie中把这个票据取回来,就可以得到用户的信息了。   上面这一段说的就是IBuySpy做的,但是一定要注意,我们自己做这些操作,和ASP.NET内置的Forms验证没有任何关系,虽然它也是通过类似的保存票据到Cookie来实现的。   用这个票据来写到Cookie与我们自定义一个Cookie去写相比有什么好处呢,首先可以设定票据的过期时间、决定是否永久在Cookie保存票据、票据中可以写入自定义的信息(比如用户所具有的角色),而且,.NET内置的FormsAuthentication.Encrypt()方法和FormsAuthentication.Decrypt()方法可以把一个票据加密成一个字符串,和从一个字符串解密出一个票据,这样省掉了我们很多的工作了。   来看看IBuySpy里面的代码,创建一个票据并写到Cookie:   FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1,  // version Context.User.Identity.Name,  // user name DateTime.Now,  // issue time DateTime.Now.AddHours(1),  // expires every hour false,  // don't persist cookie roleStr  // roles );   // Encrypt the ticket String cookieStr = FormsAuthentication.Encrypt(ticket);   // Send the cookie to the client Response.Cookies["portalroles"].Value = cookieStr; Response.Cookies["portalroles"].Path = "/"; Response.Cookies["portalroles"].Expires = DateTime.Now.AddMinutes(1);   从Cookie中读出票据,再从票据中得到用户具有的角色:   // Get roles from roles cookie FormsAuthenticationTicket......[阅读全文]

posted @ | Feedback (10) |

摘要:看了孟子E章的一篇文章,才知道原来IE4里面就已经扩展了一个DHTML Method,showModalDialog(),可以让IE弹出一个模式的显示HTML的窗体。MSDN Library中的介绍:http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/showmodaldialog.asp不会有人骂偶土吧?...:(...[阅读全文]

posted @ | Feedback (14) |

摘要: IBuySpy Portal 中使用 PortalModuleControl 这个继承自UserControl的类来作为站点中所有Module的基类,用户控件的工作方式是,当页面上实例化一个用户控件时,自动将它的所有子控件全部Render成HTML,然后输出,为了提高Module的工作效率,每个Module可以设置自己的缓存时间,在缓存时间内,系统不会再重复Render它的所有子控件,而是在第一次Render的时候,把结果HTML文本缓存起来,当下次需要的时候再直接输出。   实现缓存功能,IBuySpy是通过CachedPortalModuleControl实现的。   因为IBuySpy页面上的Module都是通过LoadControl()方法来动态载入到页面上的,像这样:   PortalModuleControl portalModule = (PortalModuleControl) Page.LoadControl(_moduleSettings.DesktopSrc);   portalModule.PortalId = portalSettings.PortalId;portalModule.ModuleConfiguration = _moduleSettings;   parent.Controls.Add(portalModule);   当检测到一个Module的CacheTime>0时,代码则:   CachedPortalModuleControl portalModule = new CachedPortalModuleControl();   portalModule.PortalId = portalSettings.PortalId;portalModule.ModuleConfiguration = _moduleSettings;   parent.Controls.Add(portalModule);   就是说,代码不会再载入PortalModuleControl类型的控件了,而是载入CachedPortalModuleControl来实现的。   下面看看CachedPortalModuleControl是如何实现缓存的:   private String _cachedOutput = "";   这里定义了一个String变量,保存缓存的内容   protected override void CreateChildControls() {   if (_moduleConfiguration.CacheTime > 0) { _cachedOutput = (String) Context.Cache[CacheKey]; }   CreateChildControls()这个方法是在Control类每次被实例化时,都会执行的方法。首先检查这个Module是否启用了缓存,如果启用了,则从Context.Cache中寻找缓存,并载入到_cachedOutput中。 (CachedPortalModuleControl实质上是一个Composite Control,有关复合控件的相关资料,参阅: ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpcondevelopingcompositecontrols.htm)   if (_cachedOutput == null) {   base.CreateChildControls();   PortalModuleControl module = (PortalModuleControl) Page.LoadControl(_moduleConfiguration.DesktopSrc);   module.ModuleConfiguration = this.ModuleConfiguration; module.PortalId = this.PortalId;   this.Controls.Add(module); }   如果_cachedOutput为null,那么说明还没有缓存,于是调用base.CreateChildControls(),然后用LoadControl()方法重新(真实的)载入控件,并把这个控件放入本控件的子控件树中。   protected override void Render(HtmlTextWriter output) {   if (_moduleConfiguration.CacheTime == 0) { base.Render(output); return; }   现在到了Render方法,这个方法用于输出控件的HTML,首先检查是否启用缓存,如果没有,直接调用base.Render()直接输出,然后return。   if (_cachedOutput == null) {   TextWriter tempWriter = new StringWriter(); base.Render(new HtmlTextWriter(tempWriter)); _cachedOutput = tempWriter.ToString();   Context.Cache.Insert(CacheKey, _cachedOutput, null, DateTime.Now.AddSeconds(_moduleConfiguration.CacheTime), TimeSpan.Zero); }   如果启用了缓存,但是用来保存缓存内容的变量为null,那么就调用base.Render()方法,把所有应该输出的HTML输出到_cachedOutput变量中,然后把这个变量的内容放入Context.Cache中。   output.Write(_cachedOutput);   最后,把这个变量中的HTML内容输出。...[阅读全文]

posted @ | Feedback (1) |

摘要:前几天在China-Pub上买了三本书。《ASP.NET Intranet 高级编程》,实际就是讲解IBuySpy的,不是很推荐,属于典型的流水帐式,典型的Wrox图书(N多人,一人一章),没什么深入的东东。只所以买,是抱着“少吃两次KFC而已”的心理把它拖进购物篮的...《ASP.NET 分布式数据应用程序高级编程》,买这本书的原因是以前看过这本书两位作者之一写的《ASP.NET WebForms 高级编程》,对那本书颇有好感,所以就本着相信作者的态度,选了这本书。翻了翻,还不错,讲解了各种环境下,数据的存取、传递和数据层的设计等等。《高级 .NET 程序设计》,讲解IL、CLR、GC的书,比Jeffery的那本《Applied...》更深入,不知行文能否比得上。作者好像就是那个写那本大块头的《C#高级编程》的。这里再夸Jeffery的那本书,不但内容充实,而且循序渐进、行文轻松,阅读起来毫丝不觉艰深,实在是难得。顺便再罗列一下以前看过的.NET书籍:《Microsoft.Net 程序设计技术内幕》,Jeff Prosise写的,名为“内幕”,实为入门(真不知道译者怎么翻译的的书名),而且是一本ASP.NET的入门书,原著和翻译都没得说,偶三个月前就是靠这本书入门.NET的。庆幸自己选对了入门书。《Applied .Net Framework Programming 中文第一版》,最有名的作者加上最差劲的翻译,呵呵,不过偶实话实说,只要你不是刚学写程序的,还是可以看的,反正我是觉得基本上看起来没有障碍,很多地方都可以“中译英”猜出原文。现在出了中文修订本,没买的人有福了。《ASP.NET WebForms 高级编程》,这本书是一本难得的佳作,作者的写作水平不容质疑。没有多层设计等深入的东西,但是有很多值得学习的内容和技巧。作者设计网页认真的态度值得钦佩,在页面设计上考虑了各种浏览器(IE、Netscape、Mozila、Opera、IBM的盲人用发声浏览器、纯文本显示的Lynx什么的...各种支持或不支持Cookie,支持或不支持JavaScript的浏览器)的兼容性和可浏览性。《ASP.NET Web 站点高级编程》,在Amazon上评价颇高,内容也确实不错,全书精华在讲述全站框架、设计(所有数据存取类、商务逻辑类和页面的)基类和权限角色管理两章,后面的那些模块基本上都是罗列代码,重复着一遍遍演示怎么用三层来进行设计等等之类的(接近于罗嗦)。下阶段要阅读的东东(好像地球人都知道了哈...):《ESP 2.0 中文版》,感谢Microsoft翻译过来了,呵呵,chm版本有了,呵呵...《A First Look At ASP.NET 2.0》,应该是第一本“(打折的)全面”ASP.NET 2.0的书籍,chm版本也有了,呵呵......[阅读全文]

posted @ | Feedback (33) |

摘要:System这个命名空间中的内容“暗示”它们是核心的、必需的、无处不在的,但是微软是否将过多的内容塞入到System这个根命名空间呢?Yukon小组和WinFS小组将他们的类放在System.Data.SqlServer和System.Storage里面,也许Microsoft.SqlServer和Microsoft.WinFS是更合适的地方。再比如,Oracle.OracleClient(或者更好的Oracle.Data.OracleClient)应该比System.Data.OracleClient更好。ODBC小组就做得很好,他们将他们的内容放在了Microsoft.Data.ODBC里面。也许不久,System这个根命名空间会变得想过去的Win32 API一样,变成一个巨大的扁平的API索引。原文见:http://www.asp.net/Forums/ShowPost.aspx?tabindex=1&PostID=407089...[阅读全文]

posted @ | Feedback (6) |

摘要:大名鼎鼎的Slippman,《C++ Prime》的作者(这本书我看了1/3,就投奔Anders的C#了...),现在在微软的VC++部门了。http://blogs.gotdotnet.com/slippman/真想好好把C++补一补啊,前提是我有足够的时间的话......[阅读全文]

posted @ | Feedback (2) |

摘要:ASP.NET 2.0中,将现阶段用于实现页面-代码分离的Code-Behind方式改为了Code-Beside方式,更加简明和舒适。Code-Behind方式通过继承实现,用下面链接中的文章的话说,“excellent OO, but awkward in practice”,呵呵,.Net Framework 1.2将支持Partial Class特性,于是ASP.NET也使用了更加漂亮的Code-Beside方式。一篇言简意赅的介绍文章:ASP.NET v2.0: Code-Beside Replaces Code-Behind...[阅读全文]

posted @ | Feedback (2) |

摘要:办公室的键盘一直让我深恶痛绝,老早就决定买个新键盘回来了。前两天一直在pconline.com.cn上看有关键盘的文章,由于偶的工作关系,对MS的东东当然还是特别关注啦,于是决定买MS的键盘,MS的东东不管软件还是硬件都是一个字,“贵”,最便宜的键盘都是99,但还是决定买这款最便宜的Basic Keyboard。今天去赛格,直奔一个键盘专卖,他们只卖微软和罗技的键盘鼠标,偶实在不会侃价,最后只以95成交。唉,同档次的罗技居然只报65,偶差点想买那款了。现在正在用着,一个字,“爽”。其实偶对微软的无线键盘鼠标套装兴趣也是非常大的,可惜价格...低、中、高档的价格分别是599、799、999......[阅读全文]

posted @ | Feedback (4) |

摘要:1. <asp:TextBox ID="name" RunAt="server" Width="30" MaxLength="50" />2. <asp:textBox id="name" runAt="server" width="30" maxLength="50" />3. <asp:textbox id="name" runat="server" width="30" maxlength="50" />也许仅仅是个人选择。我喜欢1和3,1容易阅读,3容易书写......[阅读全文]

posted @ | Feedback (4) |