代码改变世界

随笔分类 - 02. ASP.NET

浅谈这次ASP.NET的Padding Oracle Attack相关内容

2010-09-25 02:28 by Jeffrey Zhao, 18129 阅读, 收藏, 编辑
摘要:上一周爆出了一个关于ASP.NET的安全漏洞,有关这个漏洞的第一篇文章应该是ScottGu的说明,但是其中各方面谈的也是语焉不详。由于这个漏洞关系到“安全”这样敏感的话题,其中又涉及到密码学这样常人看不明白的技术,于是导致了各种猜测和推测,其中甚至与我对ASP.NET的了解所有矛盾,因此我觉得也大都不靠谱。中秋休息在家,我简单地了解了一下与这个漏洞有关的内容,总结出了一些“能够说服自己”的内容,在此记录下来。因此,这篇文章的面向读者是那些和我差不多的同学:对ASP.NET有所了解,但对密码学知之甚少。 阅读全文

F#与ASP.NET(1):基于事件的异步模式与异步Action

2010-04-02 00:14 by Jeffrey Zhao, 7170 阅读, 收藏, 编辑
摘要:提高ASP.NET应用程序伸缩性的有效手段之一便是使用异步请求。而在ASP.NET MVC 1中是不能直接支持异步Action的,因此我们需要使用一些简单的Hack方式来实现这一点。不过简单的Hack毕竟无法利用ASP.NET MVC的完整功能,幸好ASP.NET MVC 2已经正式支持ASP.NET中的异步请求处理方式,并且通过一种比较易于使用的方式提供给开发人员使用。只可惜,由于语言层面的约束,这种使用方式还是有些不便,而此时便是F#的用武之地了。 阅读全文

数十行F#打造简易Comet聊天服务

2009-12-11 12:00 by Jeffrey Zhao, 11095 阅读, 收藏, 编辑
摘要:普通的Web应用程序,都是靠大量HTTP短连接维持的。如实现一个聊天服务时,客户端会不断轮询服务器端索要新消息。这种做法的优势在于简单有效,因此广为目前的聊天服务所采用。不过Comet技术与之不同,简单地说,Comet便是指服务器推(Server-Push)技术。它的实现方式是(这里只讨论基于浏览器的Web平台)在浏览器与服务器之间建立一个长连接,待获得消息之后立即返回。否则持续等待,直至超时。客户端得到消息或超时之后,又会立即建立另一个长连接。Comet技术的最大优势,自然就是很高的即使性。而F#实现一个Comet原型,只要几十行代码。 阅读全文

Route组件GetVirtualPath方法性能优化结果

2009-12-08 01:32 by Jeffrey Zhao, 6189 阅读, 收藏, 编辑
摘要:由于使用Lambda表达式生成URL的方式性能较差,因此我使用Fluent Interface来代替原有的Lambda表达式构建方式。Fluent Interface主要对生成URL的前两个阶段(创建对象及分析对象)进行了优化,分别带来了超过2/3和1/2的性能优化,但因为最后一步,也就是使用Route对象的GetVirtualPath方法构造URL的性能没有提高,因此总体性能只提高了30%。于是我打算重新实现GetVirtualPath方法,希望得到更好的性能。那么优化的结果又如何呢? 阅读全文

真有必要去除HTML中的空白字符吗?

2009-12-07 17:59 by Jeffrey Zhao, 14200 阅读, 收藏, 编辑
摘要:刚才有朋友在MSN上问我说,他的页面中有许多空白字符,打开源文件一看发现这代码稀疏得很。他觉得很浪费,他说有什么办法可以去除它们。我问他“你的页面使用GZip压缩了吗?”他说用了,于是我回答说“那么就不用去除空白字符了,连续空白字符压缩得很好,去掉后效果不大的”。这时我又不禁想到早上那篇《博客园首页优化心得》中也有一条是“去除HTML中的空格、空行”,于是我便打算尝试一下,去除空白字符到底有多少效果。 阅读全文

jQuery Validation插件remote验证方式的Bug

2009-12-04 14:29 by Jeffrey Zhao, 25666 阅读, 收藏, 编辑
摘要:jQuery插件很多,其中一个重要的插件便是jQuery Validation,它的作用是对表单进行验证,还上了jQuery官网。不过奇怪的是,最近用下来感觉有些古怪,因为好像有些死板,已有功能的应变能力还不强,甚至还有个奇怪的Bug。任何项目有Bug其实也正常,但这个Bug其实是一个文档上已经记载了,却没有实现的功能,这就有些说不过去了。这个问题便出在remote验证方式上,还好修改起来非常容易,在此记录一下,也方便以后的参考。 阅读全文

视频:Microsoft PDC 09,算法及数据结构内容及其他

2009-11-27 13:57 by Jeffrey Zhao, 5724 阅读, 收藏, 编辑
摘要:这里又有一些新整理好的视频。Microsoft PDC 09是最近的重头,只要您是搞微软技术的,无论关注哪个技术方面,都可以找到许多有用的内容。我也经常从此类大会中了解许多平时不太关注的内容,也算是保持知识的新鲜度。此外,还有算法和数据结构相关的内容,以及有趣的Visual Studio纪录片。 阅读全文

URL生成方式性能优化结果

2009-11-19 10:33 by Jeffrey Zhao, 18197 阅读, 收藏, 编辑
摘要:继上次发现URL生成的性能问题之后,我最近一直在关注一些细节的性能优化。这些优化方式不是宏观的,理论的,而是在实践上对相同问题的不同做法进行探索。我把探索的过程和结论都发布在博客上了,从结果上看性能提高是比较明显的。但是,把它们用于解决实际问题时,效果又会如何呢?我把MvcPatch进行了一些修改,然后再使用UrlGenBenchmark进行了一番比较。 阅读全文

我在TechEd的演讲:Real World ASP.NET MVC

2009-11-09 10:03 by Jeffrey Zhao, 20892 阅读, 收藏, 编辑
摘要:上周的TechEd 2009比想象中忙,掺和了不少Session。不过一到晚上就开始胡吃海喝,总体来说过得还是挺不错的——只不过博客就落下了。嗯嗯,从现在开始继续。这个是我在这次TechEd上关于ASP.NET MVC的演讲以及演示代码下载,内容比较多,时间有些不够用。大家不妨看看,权当消遣。我去处理别的事情了……太多邮件没有回复,太多RSS没有看了。 阅读全文

为URL生成设计流畅接口(Fluent Interface)

2009-11-03 09:43 by Jeffrey Zhao, 19651 阅读, 收藏, 编辑
摘要:昨天我比较了三种URL生成方式的性能,并对结果进行了分析。从结果中我们得知使用Lambda表达式生成URL的性能最差,而且差到了难以接受的地步。经过分析,我们发现其中光“构造表达式树”这个阶段就占了接近30%的开销。虽然表达式树的节点是有些多,但是.NET中创建对象其实非常快,我实在没想到它会占这么高的比例。因此,我们需要这种做法进行方向性的调整,减少对象创建的数目。 阅读全文

各种URL生成方式的性能对比(结论及分析)

2009-11-02 00:16 by Jeffrey Zhao, 19845 阅读, 收藏, 编辑
摘要:上次我们设计了一个实验,比较三种不同URL生成方式的性能。您运行了吗?如果运行的话,有没有对结果进行一些的分析呢?现在我们就来详细观察及分析这次试验的结果,并给出我的分析。如果您有一些其他的看法,也请进行一些补充。从结果上看,Lambda表达式生成URL的性能令人难以接受,经过分析之后更发现,这是一个硬伤,必须根本性,方向性地进行改变。您对此有什么看法呢?我们不妨一起讨论一下如何做到“既美观,又高效”。如果您有更理想的做法也请告诉我。 阅读全文

各种URL生成方式的性能对比

2009-10-30 00:31 by Jeffrey Zhao, 23329 阅读, 收藏, 编辑
摘要:在上一篇文章中我们列举了各种URL生成的方式,其中大致可以分为三类:1) 直接拼接字符串,2) 使用Route规则生成URL,3) 使用Lambda表达式生成URL。我们可以轻易得知,这3种作法可维护性依次增加,而性能依次减少。不过,我们还是有一个疑问,这个性能究竟相差多少?它是否的确真的可以被忽略?为此,我们还是来进行一次性能对比吧。您可以在这里下载文末的解决方案,亲自试验一下——不过在此之前,您不妨进行一个预测,猜猜看最后的结果究竟如何。 阅读全文

浅谈URL生成方式的演变

2009-10-29 00:29 by Jeffrey Zhao, 20540 阅读, 收藏, 编辑
摘要:开发Web应用程序的时候,在页面上总会放置大量的链接,而链接的生成方式看似简单,也有许多不同的变化,且各有利弊。现在我们就来看看,在一个ASP.NET MVC应用程序的视图中如果要生成一个链接地址又有哪些做法,它们之间又是如何演变的。这个演变的过程,其实也是一步步发现缺点,再进行针对性改进的过程。我们虽然使用在ASP.NET MVC的视图作为演示载体,但是它的方式和思路并不仅限于此,它也可以用在ASP.NET MVC的其它方面(如在Controller中生成URL),或是其它模型(如WebForms),甚至与Web开发并无关联的应用程序开发上面。 阅读全文

对Action方法的参数进行双向转化

2009-10-23 09:47 by Jeffrey Zhao, 18861 阅读, 收藏, 编辑
摘要:昨天有朋友忽然告诉我,在G点中国上搜索URL Routing时,我的《请别埋没了URL Routing》一文排在首位。这不禁让我汗颜,这是因为从现在的角度看起来,这篇文章的内容虽不能算错,但的确也不算是一种非常合适的做法。那篇文章的目的是展示如何利用URL Routing的扩展能力,将URL和Route Values通过Formatter进行双向的转化。这样便可以在Action方法中使用复杂参数的同时,也可以使用复杂参数得到正确的URL。这个目标是好的,可惜当时的思路有些偏差。现在我总结出了更合适的做法,并已经在项目中大量使用,效果不错。 阅读全文

简化DomainRoute的配置

2009-10-15 09:57 by Jeffrey Zhao, 18568 阅读, 收藏, 编辑
摘要:昨天有朋友写邮件告诉我说,他正在项目中尝试着使用我提供的DomainRoute组件。我很高兴,这说明我的努力不是在自娱自乐,是对别人有实际帮助的,也有一些朋友会尝试着自行对项目进行扩展,而不总是靠微软提供的食物来过活。不过他说,他发现DomainRoute的配置非常繁琐,需要为每个Route使用WithDomain,提供了大量重复的信息。他说他也在构建了辅助API,不过似乎效果不够好,问我有没有更好的解决方法。其实是有的,因为我在使用DomainRoute的初期也遇到了这个问题,不过现在已经在MvcPatch中提供了个人认为比较令人满意解决方案。 阅读全文

浅谈Route组件的设计思考与模式

2009-10-14 09:46 by Jeffrey Zhao, 17912 阅读, 收藏, 编辑
摘要:Route组件虽然可以说是ASP.NET的“门户”,不过至今为止似乎都被微软当作是二等公民。可能是由于自带的Route类功能已经太强,微软官方或社区内都不太关注RouteBase的扩展。不过有一点是正确的,那就是在大部分情况下的确没有必要去扩展RouteBase。事实上,我构建过不少RouteBase类,不过除了DomainRoute之外,其余的都被我放弃了,例如在大半年前写的《请别埋没了URL Routing》中所提供的FormatRoute,在MvcPatch中也已经有了更好的替代品(过几天便会谈到这一点)。 阅读全文

浅谈Route规则名称的作用,及MvcPatch的处理方式

2009-10-13 10:00 by Jeffrey Zhao, 17624 阅读, 收藏, 编辑
摘要:国庆前的最后一天,我写了《关于ASP.NET Routing的几点内容》,其中谈论了ASP.NET Routing作用,设计目的,工作流程等等。不过我还有一个比较重要的东西一笔带过了,不知道您注意到了没有,在向ASP.NET Routing的RouteTable.Routes属性(一个RouteCollection对象)中添加Route规则的时候,我们会同时指定一个“名称”。在微软给出的官方“广告”中,似乎看不出这个名称有什么用。但事实上,它的功能非常关键。 阅读全文

关于ASP.NET Routing的几点内容

2009-09-30 10:44 by Jeffrey Zhao, 14789 阅读, 收藏, 编辑
摘要:在之前的文章中,有一些朋友会问我一些关于ASP.NET Routing的内容。这个组件的重要性越来越大,ASP.NET MVC,ASP.NET Dynamic Data都用到了ASP.NET Routing。事实上,在ASP.NET 4.0中还会出现对ASP.NET WebForms的支持。可惜的是,目前对于ASP.NET Routing的文档和描述内容都很少。因此,有的时候一些朋友可能无法理解我一些扩展的设计思路。现在我打算详细解释一下有关ASP.NET Routing中最常见的几个问题。 阅读全文

ASP.NET Routing对请求的处理方式

2009-09-29 15:09 by Jeffrey Zhao, 12937 阅读, 收藏, 编辑
摘要:原本这是《关于ASP.NET Routing的几点内容》一文中的一节,不过等写完这节之后发现这块内容已经比较完整了,而且它本身也是独立和最为常见的部分,因此我把它提取出来单独成文。至于那片文章的其他部分我会再修改一下,明天发布。希望这些内容会对您理解ASP.NET Routing工作方式,以及阅读ASP.NET Routing的代码有所帮助。 阅读全文

使用Model Binder绑定Action参数字段时的取舍问题

2009-09-28 13:57 by Jeffrey Zhao, 12446 阅读, 收藏, 编辑
摘要:刚才在看代码的时候忽然发现了一件可能会成为问题的情况,而这个情况还挺隐蔽的。因此,我原本写到一半的东西就暂时停下,顺延至明天,而现在先来谈谈这个问题。这个问题就是在使用DefaultModelBinder在绑定字段时的取舍问题。而您在使用ASP.NET MVC的时候不妨也检查一下,看看有没有这方面的情况。 阅读全文

在视图中使用递归生成树状结构

2009-09-27 13:45 by Jeffrey Zhao, 15876 阅读, 收藏, 编辑
摘要:在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来。例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的HTML结构。这个问题看似简单,但是如何让实现变的轻松、易于使用也是一个值得讨论的问题。这次就来谈谈这部分的情况。 阅读全文

在ASP.NET MVC中使用IIS级别的URL Rewrite

2009-09-23 15:03 by Jeffrey Zhao, 15166 阅读, 收藏, 编辑
摘要:大约一年半前,我在博客上写过一系列关于URL Rewrite的文章,把ASP.NET平台上进行URL Rewrit的方式和各自地特点进行了较为详细的描述。应该来说,已经讲的非常具体,可以应对90%的情况。其实IIS Rewrite的原理非常容易理解,进行一些简单的变化和推断之后,便可以得出一些问题的原因和解决方案。现在我们就来看一个真实案例:在ASP.NET MVC中使用IIS级别的URL Rewrite。 阅读全文

片段缓存的实际应用、延迟加载及Eazy类库

2009-09-22 14:54 by Jeffrey Zhao, 13606 阅读, 收藏, 编辑
摘要:片段缓存已经实现完整了,但好像还没有提到如何在项目中进行实际应用,那么现在就来谈一谈这方面。之前也有朋友提出,这个片段缓存难道节省的只是拼接HTML字符串的时间吗?这其实就涉及到片段缓存在实际项目中该如何使用的问题了。我们通过延迟加载来省下数据加载的开支,而且有了Eazy类库之后,定义延迟加载是件非常容易的事情。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(下):页面输出原则

2009-09-22 11:05 by Jeffrey Zhao, 15271 阅读, 收藏, 编辑
摘要:上一篇文章里已经把Html.Cache打造成了非常具有可用性的API,需要缓存时我们只需在页面上做一个标记即可。标记内部的写法和普通视图的写法相同,RenderPartial等辅助方法输出内容也会被一并缓存下来。只可惜,上次文章末尾我提到有些效果是有前提的。这个前提就是必须修改RenderPartial的实现,让它遵守一个原则:如果您是在向页面输出内容,请务必将所有内容通过页面的Writer输出。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(中):更实用的API

2009-09-21 15:49 by Jeffrey Zhao, 15504 阅读, 收藏, 编辑
摘要:上一篇文章中我们提出了了片断缓存的基本方式,也就是构建HtmlHelper的扩展方法Cache,接受一个用于生成字符串的委托对象。但是在实际开发过程中,我们最乐于看到的使用方法,应该只是使用某个标记来“围绕”一段现有的代码。不过这个方法并不实用,如果您要缓存大片的HTML,还需要准备一个Partial View,再用它来生成网页片段。这次我们会构建一个更为良好的API。 阅读全文

幻灯片:Web开发中的缓存

2009-09-21 00:32 by Jeffrey Zhao, 16286 阅读, 收藏, 编辑
摘要:这是我昨天在博文视点Open Party上海站上关于Web开发中缓存的简单讲座。原本博文视点的朋友们希望我讲一下ASP.NET MVC方面的话题(估计看我最近一直在搞这个),但是我觉得其他平台一直用的是MVC框架,而ASP.NET MVC作为“后来者”也没有什么出彩的地方,所以最终选择这个稍微“通用”些的话题。 阅读全文

从ASP.NET的PHP执行速度比较谈起

2009-09-18 12:14 by Jeffrey Zhao, 26919 阅读, 收藏, 编辑
摘要:上星期我在InfoQ发表了一篇新闻,对Joe Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结。写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实。当然,如果像某些新闻那样“换一种说法”是可以骗过一些“不明真相的群众”,但是这就有违道德了。因此,在客观陈述完新闻内容之后,我只能选择把自己的感想、评论等内容放在自己的博客上。 阅读全文

适合ASP.NET MVC的视图片断缓存方式(上):起步

2009-09-17 17:19 by Jeffrey Zhao, 19772 阅读, 收藏, 编辑
摘要:说到网站性能优化,没有什么比“缓存”更重要了。即便是某些朋友口中念念不忘的“静态页”,说到底也只是缓存了整张页面内容而已。但是,显然这样大粒度的缓存策略,在如今“牵一发而动全身”的Web 2.0站点中几乎是无法使用的。视图片断缓存,缓存的也是页面内容,它比更低级别的缓存更有效率,也比静态页等整页内容缓存的适用面要大得多。在Rails或Django中都有类似的功能,但ASP.NET MVC甚至在2.0的Road Map中还没有包含这一功能,我们只能自己动手丰衣足食了。不过有了ASP.NET WebForm作为强大的视图引擎,加这样的功能简直是举手之劳。 阅读全文

ASP.NET WebForm页面内容输出方式

2009-09-16 14:41 by Jeffrey Zhao, 30486 阅读, 收藏, 编辑
摘要:这次我们谈的话题是“Web Form页面上输出内容的方式”。这其实是一个非常旧的话题了,因为本文的内容甚至可以运用于ASP.NET 1.1之上。不过这个话题的适用范围很广,因为即使是目前最新的ASP.NET MVC框架,它的默认视图引擎依旧是基于ASP.NET WebForm的(如Page,Control,MasterPage)。甚至说,由于ASP.NET MVC框架的特性,我们会遇到更多在页面上“直接输出”内容的情况。因此,这个话题在ASP.NET MVC应用中可能由为重要。 阅读全文

Get Ready for Real World ASP.NET MVC

2009-09-16 13:37 by Jeffrey Zhao, 13108 阅读, 收藏, 编辑
摘要:2009年的TechED大会即将在北京举行(11/5 - 11/7),其中有我的一个Session。我将其命名为“Real World ASP.NET MVC”,希望可以分享一下自己在ASP.NET MVC方面的使用体会。现在,希望大家可以给我一点帮助。例如,您在使用ASP.NET MVC开发Web应用程序时有没有遇到什么困难?您认为ASP.NET MVC哪方面还无法让人满意?各个方面都可以。 阅读全文

WebFormView的标准修改办法及MvcPatch项目

2009-09-15 12:11 by Jeffrey Zhao, 12203 阅读, 收藏, 编辑
摘要:上一篇文章中我提到WebFormView的实现破坏了IView对象设计思路,它会把视图内容直接生成至HttpContext.Current而不是Render方法指定的TextWriter中。之前我提出了一种非常临时,非常山寨,非常简陋,绕弯,但是可行,或者说是可以“表现出解决问题的方法”的代码,而这次我们来做一次“标准”的修改。此外,我还创建了一个MvcPatch项目来保存这些内容。 阅读全文

应该算是WebFormView的一个Bug

2009-09-14 15:33 by Jeffrey Zhao, 12314 阅读, 收藏, 编辑
摘要:最近需要搞一些重要的功能,结果又遇到了意料外的障碍。于是又仔细地看了看ASP.NET和ASP.NET MVC的源代码,又发现了以前不曾知道的一些细节。其实ASP.NET为我们留下了不少切入点,但几乎没什么书会提到这些切入点,我们只能从微软自己的框架中一探究竟。不过这次我想谈的是ASP.NET MVC框架中的一个Bug,这个Bug在一般情况下不会出现问题,但是这的确违反了ASP.NET MVC自身的设计。这个问题就出在WebFormView对象的实现上。 阅读全文

一份值得阅读的幻灯片:微软对PHP支持的改进,及其它一些胡言乱语

2009-09-04 02:17 by Jeffrey Zhao, 10790 阅读, 收藏, 编辑
摘要:这里有一份我觉得值得推荐给大家的幻灯片。这个幻灯片是不久前举办的WordCamp China 2009上微软王超群的演讲,演讲主题是《熟悉的陌生人:微软对PHP的新支持使WordPress在IIS7上雄起》。WordCamp是业界著名的PHP大会,不过我这里推荐这个幻灯片不是为了为了推广PHP,而是为了说明一些其他问题——当然也有关于技术的有价值的内容,这些您看了幻灯片和我的文章之后就会明白了。 阅读全文

通过表达式树构造URL时忽略部分参数

2009-09-03 11:37 by Jeffrey Zhao, 4728 阅读, 收藏, 编辑
摘要:您的使用ASP.NET MVC的时候,一定遇到过使用Post接受数据的Action方法。为了实现这个功能,我们必须在客户端准备一个form,并填写它的Action——也就是Post的目标URL。按照传统的做法,我们会使用表达式树来构造这个URL,但因为ASP.NET Routing在处理配置规则中没有标明的Route Values时,会将它们作为Query String拼接在URL后面。因此,我们需要得到一种“忽略”某个参数的方式。 阅读全文

优化通过表达式树构造URL的性能

2009-09-01 19:29 by Jeffrey Zhao, 4871 阅读, 收藏, 编辑
摘要:我们继续改进通过表达式树构造URL的方式。在上一篇文章中,辅助方法可以正确地识别了ActionNameAttribute,而这次改进的则是性能方面的问题。原先的代码使用了传统计算一个表达式树的方式:“使用LambdaExpression对象封装,再编译,最后执行”来获得一个Expression对象的值。但是,Compile方法的性能是比较低下的,如果密集地执行会对性能产生一定影响。我们可以使用FastLambda中的组件来优化这部分操作的性能。 阅读全文

通过表达式树构建URL时正确识别ActionNameAttribute

2009-09-01 14:25 by Jeffrey Zhao, 5371 阅读, 收藏, 编辑
摘要:在MvcFutures项目中提供了一个辅助方法,可以将一个表达式树对象转化成一个RouteValueDictionary集合。只可惜,这个辅助方法的毛病比较多。例如,它直接把方法名作为action的值,而忽略了其上标记的ActionNameAttribute。这导致了某个被“改名”的Action方法一旦用在了表达式树中,最终得到的URL便是错误的。不过只需寥寥数行代码便可改变这个情况。 阅读全文

使用表达式树构建DomainRoute的URL

2009-08-31 15:48 by Jeffrey Zhao, 4812 阅读, 收藏, 编辑
摘要:由于DomainRoute支持针对URL域名的捕获和构造,这有些破坏了ASP.NET Routing所制定的“协议”(ASP.NET Routing只支持Path),因此在上一篇文章中,我们需要自己构造一个辅助方法来获得一个“包含域名”的URL。不过根据尽可能强类型的原则,我们应该使用的是类似于MvcFutures中定义的基于表达式树的辅助方法。由于MvcFutures已经提供了非常充足的辅助功能,因此这其实并不需要耗费我们多少代价。 阅读全文

支持DomainRoute的URL构造辅助方法

2009-08-26 12:18 by Jeffrey Zhao, 6350 阅读, 收藏, 编辑
摘要:上一篇文章中我们构造了DomainRoute类,这是一个将URL Routing扩展至域名的Route组件,于是现在我们便可以轻易地从一个URL的Domain部分中捕获数据并在程序中使用。不过作为URL Routing的另一个重要部分,在URL构建方面,我们还需给DomainRoute补充额外的支持。 阅读全文

配合域名作URL Routing

2009-08-25 16:00 by Jeffrey Zhao, 10403 阅读, 收藏, 编辑
摘要:经常有朋友问我,如何对域名作URL Routing,他们可能希望根据域名(或自域名)来获得一些值,最终影响Controller,Action或某些参数的选择。之前我只是简单地说“扩展一下ASP.NET Routing吧”,而现在由于自己也正好需要使用这个功能,便实现了一个扩展。使用下来,效果不错。 阅读全文

基于ParsedRoute的Domain Parser

2009-08-24 18:27 by Jeffrey Zhao, 5128 阅读, 收藏, 编辑
摘要:之前谈了不少关于ASP.NET Routing中ParsedRoute的内容,例如它的设计以及如何调用它的功能,其目的便是为了如今的使用作准备。现在我们就基于它构建一个Domain Parser,而这个Parser也是为今后的功能打基础的。 阅读全文

再谈ASP.NET Routing中的ParsedRoute

2009-08-24 14:10 by Jeffrey Zhao, 4917 阅读, 收藏, 编辑
摘要:ParsedRoute是ASP.NET Routing中的内部类,作用是根据既定模式将一段URL解析为一个RouteValueDictionary。上次的文章中我主要谈了如何利用反射使用类库的内部成员,而这次则想分享一些使用ParsedRoute时产生的一些想法。 阅读全文

书籍推荐:国内第一本ASP.NET 3.5 MVC技术专著

2009-08-23 15:39 by Jeffrey Zhao, 19488 阅读, 收藏, 编辑
摘要:周五的时候我知道了国内第一本ASP.NET 3.5 MVC技术专著问世了。当时忙着搬家理东西,写代码,写博客,就没有仔细搭理。现在瞅瞅,不得了,了不得,至少有四大亮点值得推荐。 阅读全文

为什么是HttpContextBase而不是IHttpContext

2009-08-21 15:15 by Jeffrey Zhao, 9515 阅读, 收藏, 编辑
摘要:由于HttpContext很难进行Mock,因此为了提高可测试性,微软随ASP.NET MVC发布了一个“抽象包”,专门用于对HttpContext及其相关组件进行抽象。不过在Preview 1版本中,这些抽象都是一个个接口,如IHttpContext,IHttpRequest等等。而在下一个版本中,立即就成为了一个个抽象类,如HttpContextBase,HttpRequestBase。现在我打算从“使用”角度来谈一下,为什么这里的确应该用抽象类而不是接口。 阅读全文

在单元测试时指定HttpContext的各种Path

2009-08-21 10:02 by Jeffrey Zhao, 6843 阅读, 收藏, 编辑
摘要:设置HttpContext中各种Path一直是个问题,因为被测试的方法可能用到各种Path中的任何一个,而各种Path之间有一定关联,如果我们完全手动设置Mock对象的话会是一个浩大的工程。还好,这个问题还算容易解决。 阅读全文

支持Area的ControllerFactory

2009-08-20 11:33 by Jeffrey Zhao, 5427 阅读, 收藏, 编辑
摘要:由于项目需要,把ASP.NET MVC 2中的Area功能搬到1.0上来吧……其实只是借用个Area名头而已,根本不是那么一回事。有时候,我们就为自己的项目做一点简单的扩展,不是很合适吗? 阅读全文

ASP.NET Routing中最令人摸不着头脑的设计

2009-08-18 19:47 by Jeffrey Zhao, 6914 阅读, 收藏, 编辑
摘要:您觉得ASP.NET Routing中最令人摸不着头脑的设计是什么? 阅读全文

DefaultControllerFactory不是线程安全的

2009-08-18 16:07 by Jeffrey Zhao, 6431 阅读, 收藏, 编辑
摘要:由于项目需要,刚才打算为ASP.NET MVC应用程序增强ControllerFactory的功能,因此翻出了ASP.NET MVC的源代码开始阅读其DefaultControllerFactory。代码不多,很容易理解,不过读着读着便发现了问题,因为我发现DefaultControllerFactory不是线程安全的。 阅读全文

ASP.NET MVC 2 Preview 1 发布

2009-08-01 01:35 by Jeffrey Zhao, 6981 阅读, 收藏, 编辑
摘要:微软发布了ASP.NET MVC 2的Preview 1版本,并在论坛中向社区征求反馈意见和建议。ASP.NET MVC 2的“主题”是“提高生产力”,提供多个有用的功能。令人放心的是,ASP.NET MVC 2 Preview 1能够与ASP.NET MVC 1.0 RTM共存,不会影响后者的正常使用。 阅读全文

浅谈线程池(上):线程池的作用及CLR线程池

2009-07-22 09:01 by Jeffrey Zhao, 37093 阅读, 收藏, 编辑
摘要:线程池是一个重要的概念。不过我发现,关于这个话题的讨论似乎还缺少了点什么。作为资料的补充,以及今后文章所需要的引用,我在这里再完整而又简单地谈一下有关线程池,还有.NET中各种线程池的基础。更详细的内容就不多作展开了,有机会我们再详细讨论这方面的细节。这次,还是一个“概述”性质的,希望可以说明白这方面问题的一些概念。文章分两段,我们先来谈谈线程池的作用,及CLR自带的线程池。 阅读全文

关于网页*静态化*及SEO问题的一些补充

2009-07-06 00:08 by Jeffrey Zhao, 14264 阅读, 收藏, 编辑
摘要:前一篇讨论“静态页”的文章反响不错,不少朋友发表了自己的看法,也给老赵更多的想法。虽然也在前一篇文章后面回复了不少内容,但是就以往经验来看,总结为一篇新的文章会让我想表达的内容更为明确。对于“静态化”这一原本就非常容易让人混淆的概念来说更是如此。在这篇文章里,老赵也会谈谈自己对于SEO这个工作的看法——以及以前遇到过的一个SEO“专家”。欢迎围观。 阅读全文

谈*静态页*(或网页*静态化*)的时候,请区分一些概念

2009-07-05 01:37 by Jeffrey Zhao, 29278 阅读, 收藏, 编辑
摘要:“静态页”,在Web应用程序开发中是很常见的概念。只是我发现目前还是有相当部分的朋友,在这方面的存在一定的误区。不久前有朋友写了一篇题为《提供生成静态页核心代码》的文章,介绍了一种“向硬盘写入页面文件”的方式。这篇文章的内容在此并不多作讨论,只是它的摘要存在一个严重的问题,因为它混淆了两个概念。现在独立写一篇文章,也想把一些问题讲讲清楚,以后在讨论的时候也好有个准。 阅读全文

自己动手生成评论RSS

2009-06-04 11:11 by Jeffrey Zhao, 25750 阅读, 收藏, 编辑
摘要:最近博客园讨论气氛热烈,有价值的评论也层出不穷。有时候我们会很希望订阅某篇文章的评论RSS,只可惜博客园目前没有这个功能。对于注册用户来说,我们可以通过点击评论框下方的“订阅回复”链接,这样就会在出现新评论的时候收到邮件。可惜匿名用户,只得不断刷新才能关注最近讨论到什么地方了。不过我们是什么人?我们是程序员,这点障碍对我们来说应该是在简单不过的小事了。自己搭一个站点,获取页面数据,分析HTML,输出为RSS,就这么简单。 阅读全文

为视图自定义辅助方法(下)

2009-04-29 22:35 by Jeffrey Zhao, 25064 阅读, 收藏, 编辑
摘要:在上一篇文章中,我们把繁冗的客户端脚本变成了可以由Visual Studio提示并轻易输出的服务器端辅助方法。但是,目前的做法还有不少可以改进的地方。我们编写辅助方法的目的便是为了简化开发,因此我们还可以在这条路上走的更远,让开发人员可以在使用我们的API时觉得更流畅,更有快感。 阅读全文

为视图自定义辅助方法(上)

2009-04-29 00:24 by Jeffrey Zhao, 23787 阅读, 收藏, 编辑
摘要:在编写ASP.NET MVC应用程序时,只依赖内置的视图辅助方法很难达到很高的生产力,即使是定义在MvcFutures中的补充类库,也很难满足项目的具体需求。此外,不同的项目有不同的特点,在很多时候也需要定义较为特殊的辅助方法,使开发人员能够更快,更方便地写出更容易维护的代码。这也是自定义视图辅助方法最主要的目的(没有之一)。而这次的文章,便是给出一个这方面的示例,可作为此类问题的一个参考。 阅读全文

使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性

2009-04-23 01:51 by Jeffrey Zhao, 22469 阅读, 收藏, 编辑
摘要:关于可测试性的重要性,老赵觉得已经不需要再过多强调了。如果您想要获得高生产力,为代码编写单元测试似乎已经是必经之路了。不过可惜的是,ASP.NET应用程序给人的感觉,始终是对可测试性不太友好,其最重要的原因之一在于对HttpContext对象的高度依赖,而我们很难对HttpContext编写Mock或Stub。而现在,我们可以基于ASP.NET Abstraction来辅助ASP.NET开发,改进代码的可测试性。 阅读全文

.NET平台下Web测试工具横向比较

2009-04-13 22:29 by Jeffrey Zhao, 24015 阅读, 收藏, 编辑
摘要:为InfoQ写的一篇新闻。由于我有三不写原则(不翻译、不介绍、不重复),觉得有些值得介绍并推广的东西,还是放在InfoQ上吧。 阅读全文

辅助方法不嫌多

2009-04-12 19:25 by Jeffrey Zhao, 21797 阅读, 收藏, 编辑
摘要:在开发项目过程中,总是会出现大量的辅助方法,例如字符串处理,代码检验,格式输出等等。如果您发现自己在多次编写类似的代码,可能就要想着如何把这些代码进行提取,变成辅助方法(亦或是类库甚至框架,关于这方面粒度问题在此不作讨论)。辅助方法的作用除了遵循DRY原则之外,也能让代码更容易编写,更为清晰,可读性也能更好——而且只要您“去做”,就会发现要得到这些好处并不困难。 阅读全文

使用IronPython检测ASP.NET程序状况(下)

2009-03-25 09:03 by Jeffrey Zhao, 27412 阅读, 收藏, 编辑
摘要:在上一篇文章中,我们在一个请求中执行了IronPython代码,通过这个方法我们可以轻松地的检查系统运行的状态,或对系统进行一些简单修改。但是这种做法只能检查系统在当前时刻的状态,在很多情况下,我们需要对系统的请求进行一段时间的采样。对于简单的数据(例如每秒执行的请求数量,请求时间),我们可以通过查看Performance Monitor中相关的计数器来获得一些概要的数据。但是,如果我们需要获取一些系统的详细状态,甚至是需要根据需要进行动态改变的自定义需求,则势必要深入到系统内部进行数据采集。那么,我们该怎么做呢? 阅读全文

使用IronPython检测ASP.NET程序状况(上)

2009-03-23 09:09 by Jeffrey Zhao, 15231 阅读, 收藏, 编辑
摘要:在维护一些生产环境中的ASP.NET应用程序时,老赵经常会感到“力不从心”。虽然我们可以建立丰富有效的监控或日志等维护机制,但是调试和分析一次程序经常需要耗费大量的脑细胞。因为我们可以使用的工具大都非常抽象,即使是一个非常微小的问题,也要用较多的时间才能发现“哦,原来是这个变量的值进入了一种奇怪的状态”。如果我们有一种机制,可以直观地检查生产环境中正在运行的程序的状态,那么一定可以大大方便我们的工作。 阅读全文

大家在开发ASP.NET应用程序时感觉有哪些值得讨论的话题呢?

2009-03-13 16:03 by Jeffrey Zhao, 8730 阅读, 收藏, 编辑
摘要:不知道大家在开发ASP.NET过程中时,会产生哪些思考呢?这些思考可以是开发方式上的,可以是部署运营上的,可以是测试实践上的——只要不是某某具体问题该怎么解决,某段代码里是否有某个Bug,只要是值得议论的话题,都可以提出。最好是具体某个问题,例如XX和XX的优劣或选择,而不是简单的说“XX方面的问题” 我想调查一下,希望可以多做一些思考和总结。 谢谢大家。 阅读全文

尽可能摆脱对HttpContext的依赖

2009-03-09 09:17 by Jeffrey Zhao, 12810 阅读, 收藏, 编辑
摘要:我们继续《ASP.NET MVC单元测试最佳实践》,今天主要谈论HttpContext的依赖问题。简单说来:虽然已经可以对HttpContext进行Mock(这点增强了可测试性),但是过度依赖HttpContext对于单元测试来说也是一个伤害。这是HttpContext对象的天性所致:它实在太复杂了。因此,我们的代码要尽可能减少对HttpContext的依赖。 阅读全文

请别埋没了URL Routing

2009-03-05 09:04 by Jeffrey Zhao, 13201 阅读, 收藏, 编辑
摘要:我们现在把数据转化的工作交给URL Routing,它的职责原本就是从URL中提取数据——任意类型的数据,以及把数据转化为URL,我们现在只是充分利用了URL Routing的功能而已。事实上,我建议任何使用URL表示的数据,都把转化的职责转移到URL Routing这一层,因为这是我们基本上无可避免地需要根据数据来生成URL。那么Model Binder难道就没有用了吗?当然不是。URL Routing负责从URL中提取数据,而Model Binder则用于从其他方面来获取参数。 打开视野,发挥程序员的敏捷思路,生活就会变得更加美好。 阅读全文

Model Binder机制的缺陷

2009-03-02 09:08 by Jeffrey Zhao, 12009 阅读, 收藏, 编辑
摘要:Model Binder提供了一种机制,将请求中的数据转化成Action方法的参数。但是它是唯一的做法吗?它真是合适的做法吗?本文提出了Model Binder机制的一个缺陷,并且在下一篇文章中提出解决方案。 阅读全文

尽可能地使用强类型数据

2009-02-27 08:19 by Jeffrey Zhao, 20285 阅读, 收藏, 编辑
摘要:我们继续来谈《最佳实践》,这次的主题便是“强类型”。强类型的好处有很多,张嘴便可随意举上几例:能够享受代码提示功能、能够获得重构工具的支持、能够在编译期发现更多错误…… 阅读全文

对ASP.NET MVC项目中的视图做单元测试

2009-02-25 01:01 by Jeffrey Zhao, 18626 阅读, 收藏, 编辑
摘要:说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试,那么我们该如何对视图进行独立的单元测试呢? 阅读全文

ASP.NET MVC单元测试最佳实践

2009-02-23 09:07 by Jeffrey Zhao, 23579 阅读, 收藏, 编辑
摘要:我对于微软的一个特点时常呈一种否定态度,那就是因为它往往为了“显摆”自己的技术而向外界展现出一种“飘渺的美好”愿景。例如WebForm推出时铺天盖地的“拖拽”风潮,看似精彩却迷人双眼。这是我在上周“.NET技术大会”上的主题Session。先提供这次Session内容的PPT和演示吧,在接下来的一段时间内,我会陆续分析这次课程的内容。希望大家能够尽可能地把东西给“用好”,而不仅仅是得到表面上的正确结果。 阅读全文

简化异步操作(上):使用CCR和AsyncEnumerator简化异步操作

2009-02-20 11:25 by Jeffrey Zhao, 10537 阅读, 收藏, 编辑
摘要:在以前的文章中,我曾多次强调应用程序中异步化的重要性。尤其对于IO密集型操作来说,异步执行对于应用程序的响应能力和伸缩性有非常关键的影响。正确使用异步编程能够使用尽可能少的线程来执行大量的IO密集型操作。可惜的是,即使异步编程有避免线程阻塞等诸多好处,但是这种编程方式至今没有被大量采用。其原因有很多,其中最主要的一点可能就是异步模型在编程上较为困难,导致许多开发人员不愿意去做。因此,无论是微软官方还是社区中都出现了一些简化异步编程方式的组件,例如微软的CCR和Wintellect's .NET Power Threading Library中的AsyncEnumerator。但是它们都有同样的局限性,例如操作之间存在依赖,则很难让它们并行执行。对于这样的场景,我们还需要构建额外的解决方案,使多个有依赖关系的异步操作之间的协作调用得以尽可能的简化。 阅读全文

为ASP.NET MVC扩展异步Action功能(下)

2009-02-04 09:04 by Jeffrey Zhao, 15413 阅读, 收藏, 编辑
摘要:续上篇:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

为ASP.NET MVC扩展异步Action功能(上)

2009-02-02 09:22 by Jeffrey Zhao, 25951 阅读, 收藏, 编辑
摘要:异步请求处理是ASP.NET 2.0中引入的高级特性,它依托IO Complete Port,对于提高IO密集型应用程序的吞吐量非常重要(详见原理描述和性能测试)。但是目前ASP.NET MVC框架缺少异步Action功能,这也就是老赵经常挂在嘴边的那个“目前ASP.NET MVC所缺少的非常重要的功能”。我在春节休假期间仔细思考了一下这方面的问题,得出了一个相对不错的扩展:完整,方便,并且非常轻巧——核心逻辑代码只有200行左右,这意味着绝大部分功能将会委托给框架中现成的内容,确保了扩展的稳定,高效并且拥有较好的向后兼容性。 阅读全文

Lab:体会ASP.NET异步处理请求的效果

2009-01-19 13:21 by Jeffrey Zhao, 10986 阅读, 收藏, 编辑
摘要:关注老赵的朋友们一定记得,我不止一次强调过在ASP.NET应用程序中使用异步方式处理请求对于提高吞吐量的作用。不过似乎很多朋友们一直没有理解这样做的原因,亦或是对这样做的效果没有一个实际的“体会”,甚至在质疑这么做的功效。现在老赵将向大家进行一个演示,我们一起来看一下这么做的实际效果如何。 阅读全文

这下没理由嫌Eval的性能差了吧?

2009-01-09 02:32 by Jeffrey Zhao, 18126 阅读, 收藏, 编辑
摘要:写ASP.NET中使用Eval是再常见不过的手段了,好像任何一本ASP.NET书里都会描述如何把一个DataTable绑定到一个控件里去,并且通过Eval来取值的用法。什么,您觉得Eval性能差不堪大用?那么就来看看这篇文章吧。(Updated:提供思考题解答) 阅读全文

对aspx等页面进行预编译以进行编译期检查

2009-01-08 12:38 by Jeffrey Zhao, 13594 阅读, 收藏, 编辑
摘要:话说在开发Web应用程序时能够很轻易地对后台代码进行编译,并获得编译时的错误。可惜有时候我们对后台代码进行重构或Find all references的时候都会忽略aspx,ascx和master等文件里的代码,因为它们只有在打开时(执行期)才能发现错误。这是一个非常惹人厌的问题,但是事实上,我们只需要对一个asp.net目录下的文件进行预编译即可发现哪里出现问题。在项目中我经常会准备一个bat脚... 阅读全文

一个较完整的关键字过滤解决方案(下)

2009-01-05 14:59 by Jeffrey Zhao, 18948 阅读, 收藏, 编辑
摘要:陷阱何在?适用场合是什么?如何控制输入过滤和输出过滤?我们真的需要HttpModule吗?性能如何?在这篇文章里,我们来针对一些问题进行讨论。如果您觉得有哪些您感兴趣但是没有涉及到的问题则请在评论中补充,我会修改文章添加一下内容。 阅读全文

一个较完整的关键字过滤解决方案(中)

2008-12-24 10:56 by Jeffrey Zhao, 20400 阅读, 收藏, 编辑
摘要:上篇文章提出的问题解决了没有?哦哦,我是指采取命名约定的方式来改变过滤行为。当然有问题,不过我这里提一下比较重要的两个:1. 首先,就是“改名”这种行为——究竟是否方便?2. 再者,命名真是我们可以控制的吗?路漫漫而修远兮…… 阅读全文

一个较完整的关键字过滤解决方案(上)

2008-12-22 09:11 by Jeffrey Zhao, 25413 阅读, 收藏, 编辑
摘要:关键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情。尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤时,上述做法更可谓“远水解不了近渴”。这时候,如果有一个通用的办法,呼得一下为整站的输入加上了一道屏障,那该是一件多么惬意的事情。这就是本文希望解决的问题。是不是很简单?我一开始也这么认为,不过事实上并非那么一帆风顺,而且在某些特定条件下似乎更是没有太好的解决方法…… 阅读全文

在Web应用程序开发过程中利用ASP.NET MVC框架的实战技巧

2008-11-07 23:18 by Jeffrey Zhao, 30639 阅读, 收藏, 编辑
摘要:这是我在TechED 2008北京站讲的一个Community Session,主要内容是在传统的ASP.NET(Web Forms)应用程序中运用ASP.NET MVC中一些优秀特性的方式。这里是PPT和Demo下载,以后我再慢慢细说。 阅读全文

概念,依旧是概念……csproj文件是做什么用的?

2008-08-04 08:57 by Jeffrey Zhao, 43736 阅读, 收藏, 编辑
摘要:本来今天是在写一篇关于LINQ的文章,不过写着写着忽然觉得有些找不着北的感觉,似乎有点过于发散了?于是来博客园逛了一下,正好发现有朋友发了一篇文章《.NET面试题,看看你的水平》,于是就在这篇文章里和目前正红火的小包子同学为某个问题进行了一番争论。而在吵吵闹闹的过程中看到这么一句话“pdb文件需要放在Debug目录下才有效果”,忽然觉得有个话题值得一说:“开发环境与运行环境”。回想起平时被问到的问题,发现有不少朋友对于开发环境和运行环境并不是分的非常清楚。那么就让我们从标题中的问题开始:“csproj文件究竟是做什么用的”。 阅读全文

输出缓存与CachePanel

2008-07-28 10:02 by Jeffrey Zhao, 39461 阅读, 收藏, 编辑
摘要:缓存的作用自不必说,提高系统性能最重要的手段之一。ASP.NET作为一个成熟、强大的应用程序框架,缓存相关的设计自然是它不可或缺的一部份。ASP.NET中的输出缓存即为所谓的“OutputCache”。不过我们有时候需要更灵活和强大的缓存方式,这就CachePanel诞生的原因。本文将分为以下三个部分: 1、缓存的级别 2、ASP.NET的Output Cache及其缺陷 3、CachePanel的构建及使用 阅读全文

方案改进:直接通过User Control生成HTML

2008-07-14 13:24 by Jeffrey Zhao, 42818 阅读, 收藏, 编辑
摘要:对于使用User Control生成HTML的方式,大家应该已经比较熟悉了,老赵也曾经写过一篇文章(《技巧:使用User Control做HTML生成》)来描述这个做法。在“我的衣橱”中大量使用了这种生成HTML的方法。不过当项目达到一定规模之后,这个方法的不足之处也慢慢地体现了出来。如果能解决这个问题,就无疑是一个锦上添花的举动…… 阅读全文

精化集ASP.NET AJAX与ASP.NET MVC分类第二轮筛选结果

2008-06-14 16:48 by Jeffrey Zhao, 47090 阅读, 收藏, 编辑
摘要:以下是包同学导给我的清单。老赵的第二轮把关很严,杀了几乎99%的文章。不过似乎有少部分并没有经过我的手,可能是其他同学转过来的吧。第三轮老赵依旧会严格把关,肯定也会杀更多(包括通过其他同学第二轮的)文章。请大家监督,有疑问请及时告诉老赵。 阅读全文

觉得有必要来澄清几组重要概念

2008-06-04 01:51 by Jeffrey Zhao, 35841 阅读, 收藏, 编辑
摘要:在阅读很多朋友问题的过程中,以及平时和别人讨论中,亦或是园子里的文章中经常发现一些误用概念的情况。如果在概念上没有形成共识,那么在工作和交流上就会造成许多问题。因此,老赵已觉得有必要特地来澄清一些概念,解释一下这些概念之间的区别和联系。希望在明确这些概念之后,大家能够把注意力集中在对于具体问题的分析解决上,而不要让沟通成为瓶颈。 在这篇文章中,我希望澄清三组概念,它们是: AJAX / AJAX框架 / AJAX.NET (Professional) / ASP.NET AJAX LINQ / LINQ to SQL / LINQ to XXX Lambda Expression / Expression Tree / 匿名方法 阅读全文

更新:让UpdatePanel支持上传文件

2008-05-04 08:57 by Jeffrey Zhao, 36341 阅读, 收藏, 编辑
摘要:在一年多前我发布了一系列文章(让UpdatePanel支持文件上传(1)、(2)、(3)、(4)、(5)),设法让UpdatePanel支持上传文件。可惜缺陷无数,当时收到了无数bug report但是我都没有时间(和兴趣)去解决,因此只是一个实验品中的实验品。这个组件还有一个问题就在于非常复杂,复杂的原因是为了解决iframe传输数据的问题。当时想了很多办法最终让IE6、7,FireFox 1.5支持了这个组件,但是对于Safari,Opera等浏览器就无能为力了。最近发现jQuery的Form插件能够在一定程度上支持我需要的功能,于是就有了简化并改进该控件的想法。虽然后来发现jQuery在这方面的表现并不如我想象中那么好…… 阅读全文

不妨来做个尝试:UpdatePanel for ASP.NET MVC

2008-04-27 23:59 by Jeffrey Zhao, 33494 阅读, 收藏, 编辑
摘要:前一段时间尝试为ASP.NET MVC构建了一个类似于UpdatePanel的AJAX解决方案,本文叙述了这个组件的设计思路以及使用方式,并提供了源代码以及示例程序。 阅读全文

MIX 2008与ASP.NET MVC框架的Road-Map

2008-02-13 17:38 by Jeffrey Zhao, 22330 阅读, 收藏, 编辑
摘要:ScottGu同学最近在Blog上发布了一些有关MIX 2008和ASP.NET MVC框架的消息。 阅读全文

随便说说:在ASP.NET应用程序中上传文件

2008-02-12 17:25 by Jeffrey Zhao, 37674 阅读, 收藏, 编辑
摘要:在Web程序中上传文件是很常见的需求,最近忽然想到了点这方面的内容,就随便谈谈吧,希望对大家有帮助。 阅读全文

明日讲座主题:ASP.NET WebForms、MVC与MVP的演变与结合

2008-01-26 15:51 by Jeffrey Zhao, 13489 阅读, 收藏, 编辑
摘要:明日博客园上海俱乐部活动,老赵有幸受邀与大家一起讨论一下ASP.NET方面的问题。经过了一段时间的思考,我准备这次的主题定为“ASP.NET WebForms、MVC与MVP的演变与结合”。 阅读全文

重提URL Rewrite(4):不同级别URL Rewrite的一些细节与特点

2008-01-13 16:35 by Jeffrey Zhao, 19184 阅读, 收藏, 编辑
摘要:在之前的文章里我们已经谈论了有关URL Rewrite的几个主要的方面。在本系列的最后一篇文章中,我们就来讨论一下有关不同级别URL Rewrite的一些细节与特点。 阅读全文

重提URL Rewrite(3):在URL Rewrite后保持PostBack地址

2008-01-13 03:17 by Jeffrey Zhao, 19921 阅读, 收藏, 编辑
摘要:在进行了URL Rewrite之后,经常会遇到的问题就是页面中PostBack的目标地址并非客户端请求的地址,而是URL Rewrite之后的地址,这就将我们服务器端的URL映射规则暴露给了客户端,甚至会引起应用程序错误。这无疑不是我们所希望的,那么我们该如何避免这个情况发生呢?本文就不同层面的URL Rewrite方式分别讨论了这个问题。 阅读全文

重提URL Rewrite(2):使用已有组件进行URL Rewrite

2008-01-13 00:27 by Jeffrey Zhao, 26669 阅读, 收藏, 编辑
摘要:可能已经没有人会使用上一篇文章中的方法进行URL Rewrite了,因为提供URL Rewrite的组件早已铺天盖地了。如果要我推荐,我指挥推荐两款组件,那就是Intelligencia的开源组件UrlRewriter.NET和IIRF,它们分别在ASP.NET层面和IIS层面上进行URL重写。 阅读全文

重提URL Rewrite(1):IIS与ASP.NET

2008-01-12 19:52 by Jeffrey Zhao, 25086 阅读, 收藏, 编辑
摘要:之前觉得这个话题已经被谈滥了。URL Rewrite早已经被广大开发人员所接受,网上关于URL Rewrite的组件和文章也层出不穷,但是总是让我感觉意犹未尽,于是最终还是忍不住提笔写了这系列文章。这些文章不会谈论URL Rewrite的价值与意义,而只会谈论纯技术的内容。文章中也不会有详尽地实现分析,而是结合了我的经验,从应用角度来讲解这个话题。您已经知道的,您还不知道的,别处已经讲过的,或者还没有讲过的,希望这系列文章的“旧事重提”不会让您觉得沉闷,并且能让您了解ASP.NET中URL Rewrite的方方面面。如果您以后再遇到URL Rewrite方面的问题是能够想到这几篇文章,估计我做梦也会笑出声来。 阅读全文

技巧:使用User Control做HTML生成

2007-12-30 23:06 by Jeffrey Zhao, 23832 阅读, 收藏, 编辑
摘要:User Control大家肯定不会陌生,在使用ASP.NET的过程中,除了aspx页面,最常见的就莫过于ascx了。ascx是一个有独立逻辑的组件,提供了强大的复用特性,合理使用,能够大大提高开发效率。通过User Control直接生成HTML内容其实已经是一个比较常用的技巧了(尤其在AJAX时代),不过网络上这方面的内容比较少,很多人还是在苦苦地拼接字符串,因此在这里我通过一个实例简单介绍一下这个技巧。 阅读全文

为WebForms说几句话,以及一些ASP.NET开发上的经验(3)

2007-12-23 18:44 by Jeffrey Zhao, 13453 阅读, 收藏, 编辑
摘要:有人说,客户端ID污染问题使脚本代码很难做到“内聚”。可能他的意思是将脚本代码提取到js文件中吧。但是我认为,这种污染“迫使”我们必须使用内聚性高的方式进行客户端开发。 这也算是一种因祸得福吧。 阅读全文

为WebForms说几句话,以及一些ASP.NET开发上的经验(2)

2007-12-22 22:41 by Jeffrey Zhao, 15072 阅读, 收藏, 编辑
摘要:在ASP.NET的WebForms刚出现时,各种“演示”看上去真的很美。这个特点微软至今还保留着,各微软技术大会上的演示真的让人感到心潮澎湃。在我看来,那些“激素大会”更是一种推广策略,而并没有将目光集中在技术细节的本身。所以微软的东西似乎总是有入门容易提高难的“毛病”。开发人员被“宠坏”了,上一篇文章中有位朋友说这就是“穷人的孩子早当家”,还是有一定道理的。在.NET环境下我们就像是官宦子弟,不过这并不能成为我们习惯于“吃喝嫖赌”的理由。我们要合理利用富裕的环境带给我们的资源,但是要适当地抛弃一些不好的东西。 阅读全文

为WebForms说几句话,以及一些ASP.NET开发上的经验(1)

2007-12-22 02:22 by Jeffrey Zhao, 23523 阅读, 收藏, 编辑
摘要:我还是想写这篇文章,我只会WebForms平反,而不会“贬低”MVC框架;我只是想证明WebForms的那些缺点到底真的是缺点,还是开发人员自身没有好好利用起这把利器。因此我将会根据我的经验,一一回应对WebForms比较常见的指责。如果措辞上有任何的不妥,也请大家多多包涵。 阅读全文

客户端访问Web Service方法的一个细节

2007-07-23 22:02 by Jeffrey Zhao, 13134 阅读, 收藏, 编辑
摘要:之前遇到一个要求,需要能够取消一个正在进行中的Web Service。这也是我第一次遇到这个功能,不过不难,我想。既然ASP.NET AJAX的客户端与服务器端通信完全通过Microsoft AJAX Library的异步通信层进行,那么我们只要得到正在请求Web Service的Sys.Net.WebRequest对象,调用其abort方法就可以了。但是究竟应该如何得到这个对象呢?其中似乎还有这么一些问题…… 阅读全文

Tip:在使用AjaxControlTookit的控件时响应事件

2007-07-11 22:31 by Jeffrey Zhao, 7908 阅读, 收藏, 编辑
摘要:AjaxControlTookit中控件的关键在于客户端的Behavior对象,Behavior对象大都有丰富的属性,方法和事件。在目前的版本中,为某些Behavior添加Event Handler并非一件很容易的事情。相信今后的AjaxControlToolkit版本中将会为一些较早的Extender补充对于客户端事件的支持,让我们拭目以待吧,只是眼下我们还需要使用一些较为有技巧的方式来实现功能了。 阅读全文

使用ASP.NET AJAX访问Script Method时启用客户端缓存

2007-07-02 12:31 by Jeffrey Zhao, 6707 阅读, 收藏, 编辑
摘要:缓存是开发高性能和高可用性Web应用的重要手段之一。作为ASP.NET AJAX的关键功能,从客户端访问Script Method会被大量用于使用ASP.NET开发的AJAX应用。这个功能有一个内置的服务器端缓存机制,不过如果我们能在客户端进行缓存则会得到更好的效果。 阅读全文

ScriptPath属性的拙劣设计

2007-06-25 20:45 by Jeffrey Zhao, 5420 阅读, 收藏, 编辑
摘要:您在为AjaxControlTookit开发Extender控件时使用ScriptPath属性吗?ScriptPath属性的拙劣设计几乎使它成为了ExtenderControlBase类中最没有用的属性了。 阅读全文

StyledAutoComplete - 支持丰富样式的自动补全

2007-06-12 18:15 by Jeffrey Zhao, 6953 阅读, 收藏, 编辑
摘要:几个月前,我扩展了Atlas CTP时期的的AutoCompleteBehavior,到了ASP.NET AJAX正式版之后这个扩展自然就不能用了。其实这段时间内有不少朋友问我该如何做到像Google Suggest那样带丰富样式的自动补全功能,但是由于各种原因,我没有深入地研究它,更别提对它的扩展了。最近手头正好有些时间,也就逼迫自己耐着性子读了读AutoCompleteBehavior的代码,并作了这个扩展。 阅读全文

BlogEngine 1.0中的编码问题及解决方案

2007-06-06 22:03 by Jeffrey Zhao, 6022 阅读, 收藏, 编辑
摘要:似乎有不少朋友在下在BlogEngine 1.0的源代码之后会发现居然无法正确编译,因为{SiteRoot}\User Controls\CommentView.cs里的代码遇到了错误。为什么引号没有封闭?作者怎么会把一个无法编译的版本发布出去呢?其实问题并非那么简单…… 阅读全文

Nikhil更新了UpdateControls组件

2007-04-14 16:30 by Jeffrey Zhao, 3146 阅读, 收藏, 编辑
摘要:Nikhil更新了他的UpdateControl包,改进了bug,也添加了一些功能。这部分组件是了解如何基于ASP.NET和ASP.NET AJAX进行开发的不错的例子。在这里推荐一下。:) http://www.nikhilk.net/Entry.aspx?id=155 阅读全文

让UpdatePanel支持文件上传(5):支持页面重定向的HttpModule

2007-04-12 11:51 by Jeffrey Zhao, 7952 阅读, 收藏, 编辑
摘要:在最后,我们还必须编写一个HttpModule来支持异步刷新时页面的重定向。 阅读全文

让UpdatePanel支持文件上传(4):数据传输与解析机制

2007-04-11 15:02 by Jeffrey Zhao, 6145 阅读, 收藏, 编辑
摘要:现在就要开始整个项目中最有技巧的部分了。如果我们的组件需要在多种浏览器中正常的运行,我们必须好好考虑一下发送和解析数据的方式。如果我们把这部分的机制完全交给ASP.NET AJAX原有的行为来执行,则会遇到问题。 阅读全文

当心异步刷新后的脚本文件加载

2007-04-09 08:43 by Jeffrey Zhao, 6472 阅读, 收藏, 编辑
摘要:如果第一次异步刷新在加载脚本时发起了另一个异步刷新,第二次异步刷新可能就会不受我们控制地被中断了。 阅读全文

让UpdatePanel支持文件上传(3):客户端组件

2007-04-06 10:10 by Jeffrey Zhao, 5066 阅读, 收藏, 编辑
摘要:我们的UpdatePanelIFrameExecutor继承了WebRequestExecutor,因此需要实现许多方法和属性。但是我们事实上不用完整地实现所有的成员,因为客户端的异步刷信机制只会访问其中的一部分。 阅读全文

让UpdatePanel支持文件上传(2):服务器端组件

2007-04-05 11:55 by Jeffrey Zhao, 6281 阅读, 收藏, 编辑
摘要:我们现在来关注服务器端的组件。目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查找特定的项,但是我们在向IFrame中POST数据时无法修改Header。所以我们必须使用一个方法来“欺骗”ScriptManager。 阅读全文

让UpdatePanel支持文件上传(1):开始

2007-04-04 12:16 by Jeffrey Zhao, 15662 阅读, 收藏, 编辑
摘要:UpdatePanel从一开始就无法支持AJAX的文件上传方式。Eilon Lipton写了一篇文章解释了这个问题的原因。文章中提供了两个绕开此问题的方法。不过,我们为什么不使UpdatePanel兼容FileUpload控件(<input type="file" />)呢?如果可以这样,一定能够受需要使用UpdatePanel上传文件的用户欢迎。 阅读全文

UpdatePanel的妙用:Incremental Content

2007-03-29 20:18 by Jeffrey Zhao, 6587 阅读, 收藏, 编辑
摘要:Incremental Content是我随意取的名字,我有时候会希望,把一些常见的场景,总结出ASP.NET AJAX一些比较固定的使用模式。Incremental Content是我为现在这个“模式”取的名字。这个模式的作用,就是使用UpdatePanel来不断地在页面上增加内容。想到这个使用方式的原因,是因为在中午与Bing对UpdatePanel的一些问题进行了讨论。他谈到,使用UpdatePanel,会造成过多的数据传输上的浪费。例如博客园的回复,事实上要更新的只是新增的内容,而并不需要整个评论区进行刷新。这篇文章谈到的Incremental Content就是为了解决这类问题而产生的。建议dudu在合适的时候修改一下添加评论的代码。:) 阅读全文

SwitchPartManager:在UpdatePanel中灵活地切换不同用户控件

2007-03-29 03:18 by Jeffrey Zhao, 8252 阅读, 收藏, 编辑
摘要:这是一个很常见的使用场景,尤其是出现了UpdatePanel之后:页面中有一排菜单,点击菜单中的每一项,都会使某个UpdatePanel中出现不同的控制面板。在开发时,往往会将每个的控制面板写成不同的用户控件,点击菜单时事实上就是在UpdatePanel中放入不同的用户控件。如果要开发这样的功能,从理论上来说并不困难,但是如果要能够在控件之间灵活切换,甚至要从控件A的某个操作中切换到控件B,可能就需要增加控件之间的耦合度了。因此,如何控制这样的切换似乎需要细细考虑一下。 阅读全文

UpdatePanel终于可以上传文件了!

2007-03-26 20:23 by Jeffrey Zhao, 37459 阅读, 收藏, 编辑
摘要:UpdatePanel终于可以上传文件了!我们要做的,只是在页面上添加一个控件而已。 阅读全文

ModalUpdateProgress控件

2007-03-26 02:33 by Jeffrey Zhao, 8292 阅读, 收藏, 编辑
摘要:在之前的一篇文章中,我谈了如何在页面中“轻量级地”实现了模态的UpdateProgress。这次,我带来了一个“重量级”的实现:ModalUpdateProgress控件。 阅读全文

ASP.NET AJAX官方资源大量更新

2007-03-23 15:05 by Jeffrey Zhao, 6652 阅读, 收藏, 编辑
摘要:这次更新最主要的可能就是官方文档的更新,尤其是对页面的客户端页面生命周期与UpdatePanel客户端生命周期(事实上前者包含了后者)提供了详细的说明和举例。 阅读全文

Tip:Modal UpdateProgress的轻量级解决方案

2007-03-22 08:50 by Jeffrey Zhao, 7223 阅读, 收藏, 编辑
摘要:又被问了这样一个问题:UpdateProgress如何像ModalPopupExtender那样的效果呢?类似的问题有:如何在UpdatePanel里使用ModalPopupExtender呢?我这次仔细想了想,感觉问题并不那么简单。 阅读全文

Tip:自定义UpdatePanelTrigger

2007-03-19 10:27 by Jeffrey Zhao, 4811 阅读, 收藏, 编辑
摘要:如果需要的话,您不妨在开发过程中自定义一个UpdatePanel触发器吧。 阅读全文

Animation全接触(2):ParentAnimation模型

2007-03-16 15:16 by Jeffrey Zhao, 3382 阅读, 收藏, 编辑
摘要:ParentAnimation,顾名思义,是一组Animation的父亲,是所有需要包含其它Animation的父类,我们熟悉的ParallelAnimation(并行动画)和SequenceAnimation(顺序动画)都是它的子类。从这个概念上来说,这也是个非常经典的Composit模式应用。 阅读全文

Animation全接触(1):Animation模型初步

2007-03-14 14:04 by Jeffrey Zhao, 4496 阅读, 收藏, 编辑
摘要:初步了解Animation模型。 阅读全文

Animation全接触(前言)

2007-03-14 02:20 by Jeffrey Zhao, 3970 阅读, 收藏, 编辑
摘要:关于AjaxControlToolkit中的Animation的话题,一直留在我的“写作队列”中。但是由于最近事情较多,一直没有开始写这个系列的文章。现在忽然意识到,如果不趁这方面的文章还没有大量出现之前推出的话,我们又要落后于那些外国人了(其实外国人也不可能知道我写了什么,可惜我会知道外国人写的东西,所以我是在“自爽”)。在这个系列中,我将对AjaxControlToolkit中的Animati... 阅读全文

第一次MSDN Webcast自我总结

2007-03-13 20:27 by Jeffrey Zhao, 9652 阅读, 收藏, 编辑
摘要:今天下午进行了第一次的MSDN Webcast讲座,自我评价并不理想。看了一些朋友的建议,我临时决定将示例的形式改变了一下,从“阅读代码”,变成的“实现功能”,也就是说把所有的示例代码手动输入,而不是复制代码片断或者是直接把实现好的示例进行代码展示和分析。这种方式给我的讲座带来了问题。由于写了不少JavaScript代码,因此出现了数个拼写错误,再加上JavaScript的错误提示是出了名的不清晰... 阅读全文

MSDN Webcast“深入浅出ASP.NET AJAX系列”预告及反馈

2007-03-12 16:54 by Jeffrey Zhao, 39204 阅读, 收藏, 编辑
摘要:我为MSDN Webcast准备了一个《深入浅出ASP.NET AJAX系列》,共有十多次课程,希望能够为大家系统的讲解一下如何使用ASP.NET AJAX框架进行开发。在这个系列中,我会尽可能的从“使用”入手,然后对于ASP.NET AJAX框架进行一定程度的深入讲解,使大家能够更自由地使用ASP.NET AJAX框架,并且能够自己着手解决一些使用中的问题。简单地说,这个系列中最着重的就是尽可能的“授人以渔”。希望大家对我的这个系列多提意见和建议,并回复在这篇文章中,我需要您的反馈来改进我的表现。 阅读全文

Tip:“Form_Load时添加的AsyncPostBackTrigger失效”问题分析及解决方案

2007-03-08 04:24 by Jeffrey Zhao, 6499 阅读, 收藏, 编辑
摘要:  最近时间很少,而且总觉得没有什么题材可写。今天无意中看到了Aldebaran's Home提出的一个疑问,为什么在Form_Load方法中动态添加的AsyncPostBackTrigger会在经过一次异步刷新后就失效,导致第二次提交变成了普通的提交。我尝试了一下,果不其然。对ASP.NET AJAX程序集源码的分析之后,我得出了问题原因和解决方案,在这里和大家共享一下。 阅读全文

ASP.NET AJAX Control Toolkit Release 10301

2007-03-03 00:20 by Jeffrey Zhao, 6053 阅读, 收藏, 编辑
摘要:与前几次相比,这次发布属于一个大的调整。 阅读全文

Sys.StringBuilder里的Bug

2007-02-13 02:35 by Jeffrey Zhao, 5895 阅读, 收藏, 编辑
摘要:Sys.StringBuilder出现了这样的Bug,他们一定没有做好Code Review。 阅读全文

鸡肋烹制出的美味——真正可调试的ASP.NET AJAX

2007-02-06 07:23 by Jeffrey Zhao, 6056 阅读, 收藏, 编辑
摘要:ASP.NET AJAX的源代码的确发布了,并且提供了pdb文件,也就是说,我们现在可以用它来调试了。不知道各位朋友们有没有真的用它跟踪到代码中去,至少我用下来之后非常的不满意。官方给出了源代码,我们为什么不设法把它恢复成C#工程呢?于是我新建了一个C# Class Library,把源代码复制到工程中去。然后通过比较编译错误、运行错误以及使用.NET Reflector查看ASP.NET AJAX程序集,一点点补充丢失的资源和代码,费了九牛二虎之力总算比较完美地恢复了ASP.NET AJAX的程序集。 阅读全文

UpdatePanel与ASP.NET Page的缓存

2007-02-04 11:18 by Jeffrey Zhao, 7023 阅读, 收藏, 编辑
摘要:UpdatePanel的功能大家一定都非常熟悉了。无论是官方还是社区里热心推广ASP.NET AJAX的朋友,都会对于UpdatePanel的使用进行大量说明与展示。但是在这些简单的的示例似乎都遗漏了一个非常重要的问题,这个问题会直接导致UpdatePanel无法正确使用。   这个问题就是ASP.NET Page的缓存。 阅读全文

编写组件,使用JavaScript更新UpdatePanel

2007-01-31 01:12 by Jeffrey Zhao, 10296 阅读, 收藏, 编辑
摘要:如果需要使用JavaScript更新UpdatePanel,以前往往会使用JavaScript来模拟Trigger的触发。我们往往会将一个按钮设为某个UpdatePanel的Trigger,然后在客户端模拟它的点击,使UpdatePanel进行更新。但是这样的做法实在太麻烦了些,也相当的不优雅。现在我们就来编写一个组件解决这个问题。 阅读全文

ASP.NET AJAX正式版带来的Validator问题及解决方案

2007-01-24 15:07 by Jeffrey Zhao, 5343 阅读, 收藏, 编辑
摘要:升级到ASP.NET AJAX正式版之后,一般来说重新编译不会有什么问题,不用做什么修改,这是个好消息。不过在执行时就会出现问题了。因为在正式版的程序集中,删除了兼容UpdatePanel的Validator那些类,因此TagMapping时就无法找到需要的类了。 阅读全文

ScriptManager的ResolveScriptReference事件的重要作用

2007-01-23 16:10 by Jeffrey Zhao, 3719 阅读, 收藏, 编辑
摘要:合理使用,支撑一个专业的详细的脚本库也不是件困难的事情。 阅读全文

Tip:使用Extender的ResolveControlID事件

2006-12-31 03:42 by Jeffrey Zhao, 3766 阅读, 收藏, 编辑
摘要:不知道大家在使用ASP.NET AJAX Control Toolkit里的各个Extender控件时,有没有接触过ResolveControlID事件?这个事件在官方也只用了很少的笔墨来描述。的确,这个事件不太常用,看看ASP.NET AJAX的演示站点,根本没有使用过ResolveControlID事件。本文简单描述了ResolveControlID事件的作用以及使用方式。 阅读全文

Tips:AccordionExtender中的DataTable数据绑定/点击特定元素出发折叠效果

2006-12-29 18:14 by Jeffrey Zhao, 3812 阅读, 收藏, 编辑
摘要:ASP.NET AJAX Control Toolkit中实现地最复杂的Extender估计就是AccordionExtender了。因为它对于DOM元素结构的要求比较高,所以它还为此实现了AccordionPane控件,用来生成符合AccordionBehavior的DOM结构。但是在使用时,似乎总是会遇到一些限制,这里将对于两个问题介绍一下简单的解决方案。 1、使用DataTable进行数据绑定 2、点击指定元素产生折叠效果 阅读全文

可能是最漂亮的非静态Page Method解决方案

2006-12-28 13:38 by Jeffrey Zhao, 7763 阅读, 收藏, 编辑
摘要:在我前一片文章《浅谈实例Page Method到静态Page Method的移植》中,我提到了两种属于work around的解决方案,的确有效,如果可以的话我也建议尽可能地改成那样,尤其是第一种“在客户端获得参数信息”的做法,性能很高,值得推荐。不过从“技术”方面来考虑,这两个做法都不如现在这种来得漂亮。我尝试着实现了一个HttpModule,只要使用了它就能轻松使用原来的“非静态Page Method”了,这几乎完全解决了ASP.NET AJAX中无法使用非静态Page Method的问题,CTP时期程序的移植也变得再容易不过。 阅读全文

UpdatePanel与UrlRewrite

2006-12-27 00:42 by Jeffrey Zhao, 9818 阅读, 收藏, 编辑
摘要:今天被问及一个UpdatePanel与Url Rewrite结合时的问题,研究之后得出解决方案,在此和大家分享一下。 阅读全文

浅谈实例Page Method到静态Page Method的移植

2006-12-26 10:48 by Jeffrey Zhao, 4421 阅读, 收藏, 编辑
摘要:最近被问及Page Method的问题比较多,主要还是如何从Atlas CTP中的非静态Page Method转向Beta或RC中的静态Page Method时所遇到的问题。现在我来谈一下在这方面的一些看法,也希望大家能和我一起探讨一下。 阅读全文

ASP.NET AJAX RC Tip:页面中无UpdatePanel时UpdateProgress创建出错问题

2006-12-20 03:02 by Jeffrey Zhao, 3347 阅读, 收藏, 编辑
摘要:安装ASP.NET AJAX RC之后,某些页面总是在创建UpdateProgress时出现脚本错误。刚才简单看了一下System.Web.Extensions.dll中的相关实现,得出了一个解决方案,在这里简单地说一下。 阅读全文

ASP.NET AJAX RC的Script文件引入方式又有了改变

2006-12-18 19:02 by Jeffrey Zhao, 1282 阅读, 收藏, 编辑
摘要:不知道朋友们有没有发现,ASP.NET AJAX RC中Script文件的引入方式有发生了改变。 在ScriptManager中使用ScriptReference引用一个脚本文件时,回归了使用<script />,而不是Sys.Application.queueScriptReference方法,其结果就是这时引入的脚本文件不需要之前的Sys.Application.notifyScr... 阅读全文

讲座展示:TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX(3)

2006-12-13 03:30 by Jeffrey Zhao, 3234 阅读, 收藏, 编辑
摘要:这次我选择的讲座内容,是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座“AJAX Pattern with ASP.NET AJAX”。Jeff Prosise是Wintellect的Co-Founder,Andre Sanabria是ASP.NET AJAX Team的Lead Program Manager。这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践,在这次讲座里,会对建立轻量级的客户端控件的方法进行深入,讲述了如何优化脚本代码,并提出了如何避免AJAX开发中常见的问题。本篇文章是这次讲座展示的第三篇,使用了一个例子来观察UpdatePanel的工作方式,并通过几个步骤对这个例子进行优化。 阅读全文

讲座展示:TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX(2)

2006-12-08 15:33 by Jeffrey Zhao, 3015 阅读, 收藏, 编辑
摘要:这次我选择的讲座内容,是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座“AJAX Pattern with ASP.NET AJAX”。Jeff Prosise是Wintellect的Co-Founder,Andre Sanabria是ASP.NET AJAX Team的Lead Program Manager。这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践,在这次讲座里,会对建立轻量级的客户端控件的方法进行深入,讲述了如何优化脚本代码,并提出了如何避免AJAX开发中常见的问题。本篇文章是这次讲座展示的第二篇,讲述了UpdatePanel的工作方式。 阅读全文

讲座展示:TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX(1)

2006-12-04 20:07 by Jeffrey Zhao, 2711 阅读, 收藏, 编辑
摘要:这次我选择的讲座内容,是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座“AJAX Pattern with ASP.NET AJAX”。这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践,在这次讲座里,会对建立轻量级的客户端控件的方法进行深入,讲述了如何优化脚本代码,并提出了如何避免AJAX开发中常见的问题。本篇文章是这次讲座展示的第一篇,讲述了这次讲座的内容概要,并浏览了第一个示例的各个功能。 阅读全文

InteWidgetTookit现有三个控件的使用方法

2006-12-02 23:07 by Jeffrey Zhao, 3050 阅读, 收藏, 编辑
摘要:在我之前的文章《我的开源项目:InteWidgetTookit》里,对InteWidgetToolkit进行了的简单介绍。现在我已经开始使用CodePlex进行开发和管理,它的地址是:http://www.codeplex.com/InteWidget,欢迎感兴趣的朋友关注。在之前的基础上,我改进了基于Dojo开发Extender所以使用的DojoExtenderControlBase与BaseScripts.js,现在使用它们开发基于Dojo的Extender只需简单地在服务器端编写一个类,使用CustomAttribute进行一些标记即可,几乎不要写任何客户端代码,并且能够在UpdatePanel中执行。现在我基于Dojo简单地开发了三个不同类型的Extender:ColorPalatteExtender、TooltipExtender和SplitContainerExtender。这次我将描述一下它们的使用方式。 阅读全文

我的开源项目:InteWidgetTookit

2006-11-27 20:03 by Jeffrey Zhao, 4210 阅读, 收藏, 编辑
摘要:“InteWidgetToolkit”很明显是一个Toolkit,也就是工具包。“Inte”是“Integrate”的缩略。而Widget的含义则是“小工具”。其实这个名字的本意是“一个集成第三方脚本类库中Widget的ASP.NET AJAX工具包”,但是目前的决定是“一个集成第三方脚本类库的ASP.NET工具包,提供了各种Widget”。InteWidgetToolkit的目的是提供各种控件,目前想法是以Extender的方式为主,但是不排除今后会加入普通WebControl的类型。目前第三方脚本控件暂且定位在Dojo和Yahoo! UI Library。 阅读全文

我的一些看法:关于AJAX框架的比较

2006-11-27 15:39 by Jeffrey Zhao, 6767 阅读, 收藏, 编辑
摘要:Dflying兄最近在对于ASP.NET的AJAX实现进行一基于数据传输大小的比较,图文并茂,颇能够在体现某些方面的问题。这不禁使我我对于这方面也进行了一些思索,这里就说一下我的看法。 阅读全文

讲座展示:TechEd Europe DEV344 - ASP.NET AJAX Control Toolkit(下)

2006-11-18 19:18 by Jeffrey Zhao, 2458 阅读, 收藏, 编辑
摘要:此次讲座分为两部分:“ASP.NET AJAX Control Toolkit介绍和使用”以及“开发一个Extender控件”。本文将对于该讲座的第二部分进行讲述,并且对其第二个演示的剩余部分进行分析。 阅读全文

讲座展示:TechEd Europe DEV344 - ASP.NET AJAX Control Toolkit(中)

2006-11-17 18:17 by Jeffrey Zhao, 2538 阅读, 收藏, 编辑
摘要:此次讲座分为两部分:“ASP.NET AJAX Control Toolkit介绍和使用”以及“开发一个Extender控件”。本文将对于该讲座的第二部分进行讲述,并且对其第二个演示的第一个部分进行分析。 阅读全文

讲座展示:TechEd Europe DEV344 - ASP.NET AJAX Control Toolkit(上)

2006-11-15 18:23 by Jeffrey Zhao, 5174 阅读, 收藏, 编辑
摘要:这次我选择的讲座内容是最近在TechEd 2006 Europe中Shawn Burke的讲座“ASP.NET AJAX Control Toolkit Unleashed: Creating Rich Client-Side Controls and Components”。Shawn Burke是微软.NET Developer Platform总监。   此次讲座的内容主要是对于ASP.NET AJAX Control Toolkit进行简单的介绍,展示了Extender控件是如何帮助ASP.NET开发人员简单地将丰富的用户体验集成到他们的Web应用程序中。在这次讲座里将看到应该如何在您的应用中使用ASP.NET AJAX Control Toolkit中的组件,并且了解开发人员是如何方便地开发一个APS.NET AJAX Extender的。   此次讲座分为两部分:“ASP.NET AJAX Control Toolkit介绍和使用”以及“开发一个Extender控件”。本文将对于该讲座的第一部分进行讲述,并且对其第一个演示进行分析。 阅读全文

深入Atlas系列:Web Sevices Access in Atlas示例(7) - 编写JavaScriptConverter处理含有循环引用的类型

2006-11-13 16:48 by Jeffrey Zhao, 2958 阅读, 收藏, 编辑
摘要:有时候在Web Service中会需要使用到比较复杂的类型,它们的特征往往都是含用循环引用,这样的对象如果交给ASP.NET AJAX中默认的序列化方式来处理则会抛出异常,大家经常遇到的“DataTable”问题正是由此引起的。关于这一点,ASP.NET AJAX自然提供了解决方法,在这里“官方”的解决方案就是JavaScriptConverter,它可以让开发人员自定义特定类型的序列化能力。 阅读全文

深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型

2006-11-11 23:04 by Jeffrey Zhao, 3877 阅读, 收藏, 编辑
摘要:在使用ASP.NET AJAX时,大家对于返回服务器端的复杂类型的情况经常会遇到问题。Dflying兄写了一篇文章来说明在如何在客户端得到Sys.Preview.Data.DataTable对象的文章,但是这种方法需要在客户端进行Sys.Preview.Data.DataTable的构造,那么我们该如何直接获得这个对象呢?再进一步,我们该如何直接获得客户端某种特定格式的对象呢?本篇文章给出了一个解决方案,事实上,这个扩展的能力还不止如此…… 阅读全文

深入Atlas系列:Web Sevices Access in Atlas示例(6) - 在客户端隐藏服务器端类型信息

2006-11-11 01:37 by Jeffrey Zhao, 2035 阅读, 收藏, 编辑
摘要:如果要在客户端指定服务器端Web Service方法所接收的参数类型,就必须在客户端通过“__type”来指定,但是这就暴露了服务器端的具体类型了,这可不太好。现在我们就来看一下应该如何解决这个问题。 阅读全文

深入Atlas系列:探究序列化与反序列化能力(下) - JavaScriptSerializer

2006-11-10 00:39 by Jeffrey Zhao, 6708 阅读, 收藏, 编辑
摘要:在ASP.NET AJAX中,客户端的序列化与反序列能力由Sys.Serialization.JavaScriptSerializer类的serialize和deserialize两个静态方法提供。在服务器端,所有的序列化与反序列化能力,包括类型之间的转换,对于开发人员来说都是由JavaScriptSerializer类的几个方法实现的。从前一片文章里我们已经知道了两个辅助的类:JavaScriptTypeResolver和JavaScriptConverter,他们的作用分别是“映射类与类标识”,以及“提供特定类的序列化与反序列化能力”。在某些情况下,我们还是需要使用JavaScriptSerializer类的方法来操作一个类型,例如使用JavaScriptConverter来自定义特定类的序列化或者反序列化,就需要使用JavaScriptSerializer类的方法,因此我们这次就详细看一下这个类的能力。 阅读全文

深入Atlas系列 - 浅析ASP.NET Beta 2中令人疑惑的脚本引入方式

2006-11-08 02:36 by Jeffrey Zhao, 4564 阅读, 收藏, 编辑
摘要:似乎已经有不少朋友在作了ASP.NET AJAX Beta 1到Beta 2的转移之后遇到了这样的问题:如果使用了ScriptManager引入了自定义的JavaScript脚本文件后会发生JavaScript错误。本文简单讨论了引发这个问题的原因,解决方案以及注意事项。 阅读全文

AJAX培训第一讲:AJAX基础

2006-11-07 20:45 by Jeffrey Zhao, 23319 阅读, 收藏, 编辑
摘要:经过了5个小时的准备,10多个小时的录制和剪辑,我终于将第一次AJAX培训的内容做完了。录一次讲座真的是一件费神费时的事情,我也深切感受到了天轰穿兄录了数十次讲座有多么不容易。这是我第一次录制讲座,所以经验有些不足,而且对着屏幕一个人傻傻地说话总是不如对着观众说话,在语气上也略显单调。虽然我已经极力yy正在为数十人作讲座的情形,但是似乎效果不甚理想。另外不知道是什么原因,录下来的声音总是不像我的原声,听上去也有些沉闷,请大家多多包涵了。如果大家对于讲座的方式上有什么意见或者建议的话,请回复在这里,您的支持能够让我们的工作越做越好。如果大家对于讲座的内容有任何疑问,请在Q & A专用文章里进行提问,当然如果您有其它任何疑问的话,也能在那里提出,我会尽快为您解答。 阅读全文

深入Atlas系列:探究序列化与反序列化能力(上) - 客户端支持,JavaScriptTypeResolver与JavaScriptConverter

2006-11-06 23:41 by Jeffrey Zhao, 4089 阅读, 收藏, 编辑
摘要:在ASP.NET AJAX中是使用了JSON作为客户端与服务器端传递对象信息的方式。因此,在ASP.NET AJAX的客户端与服务器端均提供了序列化与反序列化的能力。了解这些内容的使用方法,可以说是使用与扩展ASP.NET AJAX所必须的能力。在这两篇文章里,我们就来看一下ASP.NET AJAX中的序列化与反序列化的能力。 阅读全文

深入Atlas系列:探究Application Services(3) - 自定义客户端Profile Service支持

2006-11-05 21:32 by Jeffrey Zhao, 2525 阅读, 收藏, 编辑
摘要:  如果不能在客户端进行自定义的话,Profile Service的自定义能力还是远远不够的。虽然Profile Service没有提供一种“官方”的客户端自定义支持,不过事实上“自定义”能力“天然”地存在与客户端里。为什么?因为整个客户端是由JavaScript实现的,这种灵活的语言使得我们能够在一定程度上自由地修改客户端的行为。 阅读全文

深入Atlas系列:探究Application Services(2) - 自定义服务器端Profile Service支持

2006-11-04 04:09 by Jeffrey Zhao, 1907 阅读, 收藏, 编辑
摘要:在上一篇文章中,我们讨论了使用ASP.NET AJAX默认的Profile Service。一般来说,它已经能够迎合大多数应用的需要了。不过除此之外,ASP.NET AJAX还提供了让我们自定义Profile Service的机制。 阅读全文

深入Atlas系列:探究Application Services(1) - Profile Service分析与使用

2006-11-02 23:43 by Jeffrey Zhao, 2276 阅读, 收藏, 编辑
摘要:ASP.NET AJAX提供了Profile Service,允许开发人员异步地从服务器端访问Profile信息。从RTM开始,客户端的Profile Service还提供了对于Profile Group的支持,因此可以说已经相当成熟了。那么对于Profile Service的细节,是否大家都了解了呢?从ScriptManager的使用上来看,ProfileService是能够扩展的,那么应该如何扩展呢?细心的朋友们应该也发现了,在web.config中也增加了对于Profile Service的配置,那么这些配置应该如何使用呢? 阅读全文

深入Atlas系列:Web Sevices Access in Atlas(8) - RTM中可叹的Web Service Proxy

2006-11-01 17:39 by Jeffrey Zhao, 1920 阅读, 收藏, 编辑
摘要:使用Web Service Proxy应该是使用ASP.NET AJAX访问Web Service最常用的方法了。服务器端会根据ScriptManager中添加的Service引用而对于Web Service类进行分析,并生成相应的客户端脚本。这样开发人员就能在客户端方便而且直观地访问Web Services方法了。这是ASP.NET中很重要的功能。从官方文档上看来,CTP和RTM似乎在脚本使用这方面没有很大的改变,只要在服务器端将一些CustomAttribute改变一下就可以了。的确没错,在使用方式上只有这点细微改变,但是事实上,从生成脚本本身来说,CTP和RTM的做法大相径庭。 阅读全文

深入Atlas系列:Web Sevices Access in Atlas(7) - RTM中的客户端支持

2006-10-30 16:46 by Jeffrey Zhao, 2600 阅读, 收藏, 编辑
摘要:在RTM版本中,客户端访问Web Services的基础类库发生了一些改变,并直接影响到了它们的使用方式。对于自己写ASP.NET AJAX组件(例如ExtenderControl)的朋友们来说,了解这部分改变是非常重要的。 阅读全文

深入Atlas系列:客户端网络访问基础结构示例(1) - 编写并使用自定义的WebRequestExecutor

2006-10-30 03:05 by Jeffrey Zhao, 2849 阅读, 收藏, 编辑
摘要:WebRequestExecutor是ASP.NET AJAX网络访问基础结构的唯一修改点。理论上,我们可以使用自定义的WebRequestExecutor来取代默认的XMLHttpExecutor。我们要做的,其实只是开发一个继承于Sys.Net.WebRequestExecutor类。不过事实上,在实际使用中,Sys.Net.XMLHttpExecutor已经足够用了,真的要自定义,也只需继承这个类即可。就像接下去的例子一样。 阅读全文

深入Atlas系列:客户端网络访问基础结构(下) - WebRequestExecutor和XMLHttpExecutor

2006-10-29 05:10 by Jeffrey Zhao, 2400 阅读, 收藏, 编辑
摘要:正如前一篇文章所说的那样,WebRequestExecutor是客户端网络访问的基础结构的唯一扩展点,而XMLHttpExecutor是其默认实现。在ASP.NET AJAX中,开发人员能够将自定义的WebRequestExecutor子类设为默认的Executor,也可以为某一个WebRequest指定一个特定的Executor。虽然一般来说XMLHttpExecutor已经足够大多数应用,但是既然ASP.NET AJAX提供了这个功能,我们也根据默认的类进行一下这方面的学习。 阅读全文

AJAX讲座内容提纲(意见征询)

2006-10-29 00:05 by Jeffrey Zhao, 3232 阅读, 收藏, 编辑
摘要:AJAX作为一个“新生事物”已经被几乎所有人接受了。大家对于AJAX应该也有了一定的学习,因此我总是感觉AJAX的东西容易让人听腻,想做好不容易。下面是我初步定下来的提纲,希望大家能多提一些意见和建议,我会随时更新和细化这些内容。 阅读全文

深入Atlas系列:客户端网络访问基础结构(上) - WebRequest的工作流程与生命周期

2006-10-27 00:50 by Jeffrey Zhao, 3582 阅读, 收藏, 编辑
摘要:ASP.NET AJAX的许多功能会要求异步地访问服务器端,例如访问Web Services,Authentication/Profile Services(事实上和访问Web Services是相同的机制)和Partial Rendering。在ASP.NET AJAX中,所有的这些访问都是通过一个网络访问的基础结构来完成的,无一例外。 阅读全文

深入Atlas系列:客户端代码编写规则分析与指南

2006-10-25 18:29 by Jeffrey Zhao, 3800 阅读, 收藏, 编辑
摘要:在RTM版本中,我们可以发现ASP.NET AJAX的客户端脚本引入了许多规则:有方法注释规则,有参数验证规则,而且对于Debug和Release模式下的脚本代码,甚至添加在程序集里的方式,也有相当严禁的规则。如果我们想要编写真正规范和严谨的代码或组件,了解这些规则是非常必要的。有了这些规则,用户在使用Debug模式进行开发和调试时可以得到更好的提示(比如Call Stack),下一版本的Visual Studio“Orcas”也会根据这些规则提供良好的IntelliSense功能。另外,了解这些规则也有利于帮助开发人员阅读和理解客户端代码,这不也是我写“深入Atlas系列”的目的吗?在这片文章里,我将使用ASP.NET AJAX的脚本代码为范例,对开发规则进行一番描述。在某些时候也会对客户端和服务器端的部分代码进行简单的分析。 阅读全文

[意见征集]AJAX培训

2006-10-25 00:30 by Jeffrey Zhao, 3186 阅读, 收藏, 编辑
摘要:承蒙厚爱,经过培训团队的讨论之后,决定将由Dflying Chen和我负责AJAX部分的培训。初期培训的方式是录制视频讲座并提供下载,等条件成熟后会逐渐转向在线培训的方式。  培训的内容为AJAX,将着重讲述AJAX在ASP.NET中的应用。初期的侧重点将是AJAX基础部分的讲解,并逐渐过渡到微软公司的ASP.NET AJAX框架。虽然会由我们来决定讲座的内容与提纲,但是由于我们的目的是服务于各位... 阅读全文

为ASP.NET AJAX 1.0 Beta补充trace和dump功能

2006-10-24 11:01 by Jeffrey Zhao, 2357 阅读, 收藏, 编辑
摘要:ASP.NET 1.0 Beta将客户端的Debug能力大大减弱了,window.debug对象目前只剩下了fail和trace功能,这让以客户端开发为中心的开发人员觉得非常不满。本文为RTM增加了CTP的trace和dump能力。 阅读全文

在虚拟主机上部署ASP.NET AJAX 1.0 Beta的程序集

2006-10-23 17:46 by Jeffrey Zhao, 3836 阅读, 收藏, 编辑
摘要:说明了在虚拟主机中部署ASP.NET AJAX 1.0 Beta的程序集的方法,并提供模版下载。 阅读全文