Scott Guthrie 博客中文版

Scott Guthrie's Blog on ASP.NET and .NET (英文原版地址:http://weblogs.asp.net/scottgu)

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 252, 评论 - 1157, 引用 - 436

导航

标签

每月存档

最新留言

广告

【第1页/共2页,15条】
首页
前页
1

ComponentArt推出针对ASP.NET AJAX的Web.UI控件

【原文地址】ComponentArt Releases Web.UI for ASP.NET AJAX
【原文发表日期】 Friday, September 29, 2006 11:26 AM

ComponentArt今天宣布推出与ASP.NET AJAX扩展(即Atlas)相集成的Web.UI控件的商业版。 

点击这里观看他们的一些在线演示,这些演示给人的印象非常深刻。  你也可以在他们的网站下载这些控件的beta版,以及浏览他们使用ASP.NET AJAX库为这些控件建立的客户端API参考网页

我盼望看到的一件事是,在ASP.NET AJAX接近推出完全支持的1.0版本时,能看到使用ASP.NET AJAX建立的所有这些棒极了的控件,无论是商业版的还是开源版的。我很高兴看到象ComponentArt推出的这些非常酷的控件,这些控件将允许开发人员在很短的时间内开发出响应非常好的用户界面。

希望本文对你有所帮助,

Scott

标签:,
 
(思归译)

posted on 2006-09-30 12:09:00 by scottgu  评论(4) 阅读(8390)

技巧和诀窍: .NET和ASP.NET模式和实践向导管理器

【原文地址】Tip/Trick: Patterns and Practices Guidance Explorer for .NET and ASP.NET
【原文发表日期】 Wednesday, September 27, 2006 10:16 PM

六月份时,我曾写过帖子,介绍微软模式和实践组正在开发的酷极了的崭新的.NET和ASP.NET模式和实践向导管理器(Guidance Explorer)

之后,这个产品组一直在苦干,最近把项目移到了微软的开源网站CodePlex上。你可以去这里访问甚至参加这个项目。向导管理器用户界面(Guidance Explorer UI )的所有源码,(当然是用.NET和Windows Forms开发的),现在也可以从CodePlex上的项目网站上免费下载到了。

向导管理器提供了一个关于ASP.NET,ADO.NET和.NET Framework方面的推荐的实践和最佳实践的数据库,你可以很轻松地筛选和查询。其中特别有用的是一些在部署前性能和安全方面的最佳实践的清单(checklist),你可以很轻松地按步照办。

你可以建立定制的视图,只包括你关注的那些推荐实践的内容。比较酷的是,你现在也可以很轻松地把这些定制的视图发布给你的朋友或你的开发组的其他成员:

你也能订阅本地共享或网上的向导feed:

最棒的是,你现在也可以建立自己的推荐实践,把它们加到数据库里去,与其他人分享。

今天就去CodePlex的项目网站下载该项目以及全部源码,开始使用起来吧!

希望本文对你有所帮助,

Scott

标签:, , ,
 
(思归译)

posted on 2006-09-28 22:05:00 by scottgu  评论(3) 阅读(6210)

技巧和诀窍;在VS 2005里优化ASP.NET 2.0Web项目的Build性能

【原文地址】Tip/Trick: Optimizing ASP.NET 2.0 Web Project Build Performance with VS 2005
【原文发表日期】Friday, September 22, 2006 11:47 AM

这个帖子讨论在Visual Studio 2005中开发web项目时,如何优化其Build性能。如果你正受缓慢Build的煎熬,或者想知道怎么提高Build速度,请继续读下去。

VS 2005 网站项目和VS 2005 Web应用项目简介

 VS 2005 支持两种项目模型:VS 2005 网站项目(Web Site Projects)VS 2005 Web应用项目(Web Application Projects)

VS 2005 网站项目是VS 2005刚发行时内置的项目模型,它提供了一个基于无项目 (project-less)的模型来开发web应用,该模型使用了ASP.NET 2.0在运行时使用的同个动态编译系统。而VS 2005 Web应用项目则是今春早些时候发布的一个完全支持的可下载项目模型,它提供了一个使用了基于MSBuild的build系统的项目模型,可以把一个项目中的所有编码编译成单个程序集 (与VS 2003类似,但又少了VS 2003 web项目中涉及FrontPage服务器扩展,IIS依赖性,以及其他问题的种种限制)。想进一步了解VS 2005 Web应用项目的话,请参考我发表在 http://webproject.scottgu.com网站上的系列教程。注意,对VS 2005 Web应用项目的支持将包含在VS 2005 SP1中,这样以后就不用另外下载了。

VS 2005网站项目和VS 2005 Web应用项目两个模型在将来的Visual Studio版本中将会继续被完全支持。我们发现,有些人喜欢一个模型,憎恶另外一个模型,反之亦然。从特性(feature)的角度看,没有“最佳的模型选择”这一说,完全取决于你个人的爱好和你们的团队协作机制(team dynamics)来决定哪个模型最适于你。譬如,许多的企业开发人员喜欢VS 2005 Web应用项目模型,因为它提供了更多的build控制和团队集成支持,而许多的web开发人员则喜欢VS 2005网站项目模型,因为它的“即存即行(just hit save)”的动态模型和灵活性。

有2篇文章,你也许会发现在决定采用哪个模型时有用,这篇MSDN上的白皮书内含对这两个模型的比较, 而Rick Strahl的《Web应用项目和Web 部署项目发布了》一文对不同选项的利弊做了一个很好的讨论。

想从VS 2005 网站项目模型迁移到VS 2005 Web应用项目模型的话,请按这个C#VB版的教程里示范的步骤做。

那么哪个项目模型Build起来快些呢?

在对项目做full build时,VS 2005 Web 应用项目模型编译起项目来会比VS 2005 网站项目模型快很多。full build是指对项目里的每一个类和网页要做编译或重新编译的情形,要么因为你在build菜单里选了Rebuild,要么因为你修改了一个依赖的类库项目或者/app_code子目录里的编码,然后点击了build或按了ctrl-shift-b来编译解决方案。

在这些“全部重新编译(full rebuild)”的情形下,VS 2005 Web 应用项目编译比VS 2005 网站项目快很多有几个原因。主要原因是,跟在VS 2003中一样,VS 2005 Web 应用项目只编译你的页面的后台编码(code-behind)以及你项目中的其他类文件。它既不分析也不编译你的.aspx 页面内的内容/控件/行内(inline)编码,这意味着,它不需要parse那些文件。坏处是,这也意味着,在编译过程中,它不会检查那些文件是否有错(而VS 2005 网站项目则会识别其中的任何错误)。好处是,这使得编译极其快。

那么,这是否意味着你总是应该在大型项目的情形下使用VS 2005 Web 应用项目模型来得到最快的build 时间呢?不,不一定。VS 2005 网站项目的一个很好的特性是对“按需编译(on demand compilation)”的支持。这在你对所依赖的文件做了变化(dependent changes)后,让你避免常规地重新编译整个项目,而是只需要对那些你正在编辑的页面做重新编译,而且这个编译是按需进行的。这会给你的解决方案带来build性能上的极大改进,而且也会在开发非常大的项目时给予你非常好的工作流程。如果你想要在保持网站模型灵活性的同时改进build性能,我强烈推荐使用这个模型。

下面几节提供了针对VS 2005 网站项目模型和VS 2005 Web 应用项目模型优化技术方面的特定教程,包括我上面描述的“按需编译(on demand compilation)” build 选项。

优化VS 2005 网站项目Build时间的特定技巧和诀窍

在使用VS 2005 网站项目模型时,按下述步骤做的话,你就可以极大地改进build性能:

1) 确认你没有遭受我称之为“程序集引用冲突(Dueling Assembly References)”的问题。我在这个博客帖子里描述了如何发觉和解决这个问题。如果你曾经在build时看到编译过程好像在“正验证网站(Validating Web Site)”这个编译阶段停顿了(意即,输出窗口里超过几秒钟都没有输出)的话,你非常可能是遇上这个问题了。使用上述这个博客帖子里概述的技术来解决这个问题。

2) 把在/app_code子目录里的文件的数目保持在很小的范围。如果你最后在这个目录里有一大堆类文件的话,我建议在你的VS解决方案里另建一个类库项目,把这些类移到这个类库项目里去,因为类库项目比/app_code子目录里的类编译快多了。如果在/app_code目录里只有小数量的文件的话,这通常不是个问题,但你有很多目录或数十个文件,那么把这些文件移到一个单独的类库项目里,然后在你的网站项目里引用这个类库项目,你将能改进build速度。另一个需要知道的事情是,每次你在VS HTML设计器里从源码视图转换到设计视图时,设计器会在设计表面加载之前引起/app_code目录的编译。原因是,这样你就可以在设计器里使用在/app_code目录里定义的控件。如果你没有/app_code目录,或者里面没几个文件,那么页面设计器加载起来就会极快,因为它不需要先做很大的编译工作。

3) 在你的网站项目中激活“按需编译(on-demand compilation)”。右击你的网站项目,打开项目属性页。在左边点击Build区,打开项目的build设置。在设置里把“F5启动操作(F5 Start Action)”从“Build Web Site(网站)”改成“Build Page(页面)”或“No Build (不Build)”选项。然后,确认清除了“把网站当作解决方案一部分来Build (Build Web site as part of solution)”复选框:

在你点击ok接受设置改动后,你将处于“按需编译”模式下。这意味着,在上面的对话框你选了“Build Page(页面)”的话,你编辑了一个页面,按F5(以调试模式运行)或Ctrl-F5(以非调试模式运行)时,解决方案将跟以前一样,编译所有的类库项目,然后编译 /app_code 目录以及Global.asax文件,然后,不再对网站里所有的页面做重新核实,而是只核实你手头的网页,以及这个页面引用的任何用户控件。在含有大量网页的大型甚至中型项目中,这很明显会带来极大的性能改观。注意,ASP.NET 会自动重新编译你在运行时访问的任何其他页面或控件,这样,你运行的应用程序用的总是最新的编码,而不必担心老的编码在运行。你也可以选“No Build”,省略IDE里page级的验证,很明显会进一步提高整个过程的build速度。我建议你对这两个选项都尝试一下,看你喜欢哪个。

不选“把网站当作解决方案一部分来Build (Build Web site as part of solution)”复选框,你会发现Ctrl-Shift-B键(触发build解决方案)会继续编译所有的类库项目,但不会重新build你网站项目里的所有页面。在此场景下,你依然会得到完整的intellisense支持,这样你不会失去任何设计时的支持。在打开页面时你也会继续得到警告/出错的弯曲的下划线提示(warning/error squiggles)。如果你需要对没有打开的页面,或对所有的页面强迫做重新编译的话,你可以使用Visual Studio的Build菜单里的Build Page或Build Web Site菜单选项:

这让你来控制你要核实你网站上的哪些页面以及什么时候核实,可以极大地改进build性能。我推荐做的一个诀窍是,在你的环境里添加一个快捷键,允许你很快地触发Build Page操作,以避免使用鼠标和菜单。你可以这么做,选择工具->定制菜单选项,然后在定制对话框的左下方点击“键盘”按钮。这会打开一个对话框,让你选择VS Build.BuildPage命令,然后与你想要的任何键组合相关联:

设置完毕后,在任何页面上,你可以打入Ctrl-Shift-P (或者你设置的任何键),会引起VS编译任何改动过的类库项目(效果跟Ctrl-Shift-B一样),然后核实/app_code目录里的所有类,然后重新build当前项目里你手头正编辑的页面或用户控件(以及被引用的母板页或所使用的用户控件)。

应用上述步骤之后,你应该发现你的build性能和灵活性大为提高,而且你对build什么时候发生有完全的控制。

优化VS 2005 Web应用项目Build时间的特定技巧和诀窍

如果你使用VS 2005 Web 应用项目模型的话,下面是几个你可以考虑的优化手段:

1) 如果你有一个很大的项目,或者与很多其他开发人员在一同开发一个项目,那么你也许要考虑把这个项目分成多个子web项目。我不见得会为性能的原因推荐这么做(除非你有成千上万个页面,否则效果不大),但它有时会有助于管理一个大项目。请阅读我以前写的这个关于怎么建立子web项目的帖子来了解怎么使用这个手段。

2) 考虑给你的解决方案添加一个VS 2005 Web部署项目来作深层的校验(verification)。在上面我提到,使用VS 2005 Web 应用项目的一个弊处是,它只编译你的页面的后台(code-behind)源码,并不对实际的.aspx标识符做进一步的校验,所以它会错过你在.aspx 页面里写错了tag的那些情形。这提供了与VS 2003 同等级别的校验支持(这样你也没有损失什么),但没有网站项目模型那么深入。有一个方法,你仍旧可以在VS 2005 Web 应用项目模型里得到网站项目模型那个级别的校验,就是添加一个VS 2005 Web部署项目到你的解决方案里(Web部署项目既可以和网站项目模型,也可以和web应用项目模型合作使用)。你可以配置它只在build你解决方案的release和staging版本时才运行,以避免在开发时build受影响,然后在发布你的应用前,用它来同时提供对你的内容和源码的深层的校验。

优化任何VS 2005项目Build时间的常用技巧和诀窍

在编译项目/解决方案时有性能问题时,我建议检查的几样东西:(注:当我听说新的技巧时,我会不断地添加到这个列单上,所以,以后请不时回来查看一下新内容):

1) 提防Virus Checkers,Spy-Bots和Search/Indexing工具

VS频繁访问文件系统,很明显地,每次它编译时,都需要重新parse一个项目里变动过的任何文件。有一个问题,我见到不少人报告过的,是在病毒扫描程序,spy-bot 检测程序,或者桌面 search indexing工具过分密切监测一个内含项目的目录的情形下造成的,因为它们不断地变更这些文件的时间戳(timestamp)。它们并不改变文件的内容,但它们确是改变最后访问的时间戳,而VS也使用这个时间戳。这就会造成一个模式:你对某个文件做了一个变动,重新build,然后在后台(background),这些病毒/搜寻工具进去,重新搜寻/检查这个文件,然后把这个文件标记为改动过了,从而导致 VS重新把它编译一遍。如果你看到build性能问题,检查一下是不是这个问题,以及考虑禁止别的程序扫描你在工作的目录。我也见过报告说,某些Spybot工具会导致VS 调试时极其缓慢,所以你也许也应该确认一下你的问题是否跟那些工具有关。

2) 关闭Windows Forms 设计器选项中的AutoToolboxPopulate

VS 2005里有个会导致VS自动把作为你解决方案一部分一起编译的任何控件加载到工具箱的选项。这是个在开发控件时非常有用的特性,因为当你编译时,VS会自动更新它们。但我看到几个报告,报告人说这个选项在某些情形下会导致VS编译时花非常长的时间(几乎象死机一样)。注意,这同时适用于Windows Forms和 Web 项目。想禁止这个选项的话,选择工具->选项菜单,然后勾销Windows Forms Designer/General/AutoToolboxPopulate复选框。(见相关议题:http://forums.asp.net/1108115/ShowPost.aspx)

3) 检查哪些第三方工具包正在Visual Studio中运行

有很多很棒的第三方VS工具包你可以插入Visual Studio。这些工具可以带来很高的生产力,而且提供成堆的功能。但有时我也看到有些性能和系统稳定性问题是受了它们的影响,特别是在使用了这些工具包的早期(或者beta)版本的情形下(你应该总是留心什么时候工具包制造商会更新这些版本)。如果你看到与性能和稳定性有关的问题的话,你也许要尝试一下卸载任何工具包来看是否有作用。如果有作用的话,你可以跟第三方工具包制造商合作识别问题所在。

Visual Basic之Build性能HotFix

Visual Basic产品组刚发布了涉及大型VB项目编译性能问题的几个hotfixes。你可以从这个博客帖子里了解到如何立即得到这些hotfixes。Visual Basic产品组还有一个直通email 地址,vbperf@microsoft.com,你可以用它来直接联系他们,假如你遇到性能问题的话。

希望本文对你有所帮助,

Scott

标签:, ,
 
(思归译)

posted on 2006-09-26 09:27:00 by scottgu  评论(19) 阅读(10350)

技巧和诀窍:UpdateProgress控件和AJAX活动图像动画

【原文地址】Tip/Trick: UpdateProgress Control and AJAX Activity Image Animations
【原文发表日期】Thursday, September 21, 2006 1:06 PM

ASP.NET AJAX扩展(即Atlas) 提供的很酷的新控件之一是UpdateProgress控件。这个控件允许你在AJAX回调的进行过程中,自动在页面上显示指定的UI。同时,如果AJAX回调耗时太长,你还可以在UI上提供一个选项让用户来取消AJAX回调。在页面上使用该控件,只须这样声明:

    <atlas:UpdateProgress ID="progress1" runat="server">
        
<ProgressTemplate>
        
            
<div class="progress">
                
<img src="indicator.gif" /> 
                Please Wait...
            </
div>
        
        
</ProgressTemplate>
    
</atlas:UpdateProgress>

在AJAX回调进行中,<ProgressTemplate>里的内容就会显示。你可以通过CSS将里面的内容显示在页面的任何位置,例如,你可能想直接在GridView或其他元素上方通过渐显效果把它显示出来。开发人员经常使用动画图像显示进度,现在也可以在<ProgressTemplate>里面实现这样的效果。

Alan Le最近发了一个很酷的链接,指向几个非常有用的网站,这些网站提供了许多动画进度的图标。你可以很容易地将它们与UpdateProgress控件结合使用,来显示回调操作的进度:

你可以从这几个网站上下载到可用的旋转齿轮和进度图标。下面是几个例子:

本周早些时候,我提到新发布的Atlas控件工具包现在包含了一个动画效果库,可以和ASP.NET AJAX扩展一起使用。与UpdateProgress控件配合使用的话,它们能给你的网站增添很好的视觉效果。

希望本文对你有所帮助,

Scott

 

标签: , ,
 
(Ring译)

posted on 2006-09-22 16:15:00 by scottgu  评论(9) 阅读(11985)

九月份Atlas控件工具包发布(现支持动画效果)

【原文地址】September Atlas Control Toolkit Released (Now with Animation Support)
【原文发表日期】 Tuesday, September 19, 2006 8:28 AM

Atlas控件工具包的最新版已于上个星期晚些时候推出。这个工具包基于核心ASP.NET AJAX 运行时,是个提供了很多有用的具备AJAX功能的ASP.NET控件库。你可以在这里下载和运行样本程序

就象我在以前的帖子里提到的那样,这个工具包很酷的地方就在于,它包含了几个由非微软开发人员提供的控件。例如,在这个更新版本里,有一个非常酷的新Slider控件(点击这里观看它的实战演示),就是由非微软开发人员贡献的,它提供了非常平滑的,在客户端从数值范围选值的支持:

这个版本里还包括了对一些渐为时兴的客户端动画效果的支持。你可以直接在JavaScript里使用动画效果包,或者通过<atlasToolkit:AnimationExtender>控件来轻易地组合动画行为,以响应用户的动作。譬如,你可以让文字和图片渐现,扩大,爆炸,移动,或pop-up等等。

动画效果包很酷的地方在于,你可以通过<atlas:AnimationExtender>控件,用声明的方式来定义动画行为,这使得定义动画顺序起来既干净又不费力。

你可以在这里进一步研究这个新的动画效果包,同时也能在线运行相关演示。务必查阅一下动画效果包的参考页,以深入学习动画效果类框架,以前它支持的所有的方法,属性和事件。

除了响应用户点击或客户端行为触发动画效果以外,你也可以在用ASP.NET AJAX UpdatePanel控件刷新部分页面做的postback时,使用新的<AtlasToolkit:UpdatePanelAnimationExtender>控件来添加动画效果的支持。这可以使得突出显示变化了的界面的方式更干净,更加对用户友好,譬如,你可以逐渐显示那些变化,或者真想出奇的话,你可以旋转/加彩变化了的界面,让你的用户看了都会晕眩。看一下UpdatePanelAnimationExtender的这个在线演示,深入研究一下这个控件。Alan Le在这里贴了一个很棒的简单例子,给你演示怎么通过这个控件用声明的方式组合动画,你应该去看一下。

一如既往,你可以免费下载带有全部源码的Atlas控件工具包,也可以在线运行它。想进一步学习使用ASP.NET AJAX(即Atlas)以及控件工具包的话,读一下我几个星期前写的这篇博客帖子,内含一堆很棒的免费录像的链接。

希望本文对你有所帮助,

Scott

标签:,
 
(思归译)

posted on 2006-09-20 10:06:00 by scottgu  评论(12) 阅读(7606)

技巧和诀窍:在VS 2005里使用Vista的IIS7

【原文地址】Tip/Trick: Using IIS7 on Vista with VS 2005
【原文发表日期】 Tuesday, September 19, 2006 7:41 AM

上个星期,几个人都询问我怎么在Windows Vista上使用VS 2005 建立IIS7上的网站。具体来说,他们都遇到了一个问题,在试图连接IIS7时,他们要么看到一个对话框要求他们安装FrontPage服务器扩展,要么得到一个“你必须是管理员组的成员”的出错消息,如下图所示:

Bradley发表了 一个很好的帖子,描述了如何使得VS 2005连接到IIS 7.0的详细步骤。简短地说,你需要按下面二个步骤进行:

1) 你需要确认在IIS7里安装了可选的IIS 6 Management Compatibility(IIS 6管理兼容)这个选项。这将为新的配置系统安装一个与VS 2005使用的老的Metabase API相兼容的API。你可以在Vista 控制面板中的Turn Windows Features on or Off(打开/关闭Windows特性)对话框里选择该选项:

 

2) 你需要确定以高级权限来运行VS 2005,这样你才能有管理权限连接到IIS。如果要调试一个服务,或者创建网站或者改动影响整个机器的配置时,你需要拥有管理权限。具体做法是,在启动VS时,右击VS图标,然后选择“以管理员身份运行(Run as Administrator)”:

注意,假如你启动了UAC(用户访问控制)的话(注:UAC在Vista中默认是启动的),即使你的用户账号已经是管理员组成员,你还是需要这么做。如果你禁止了UAC(你可以通过控制面板来这么做),那么这第二步就不需要了。如果你使用VS 2005内置的Web服务器的话,那么你不需要以高级权限运行VS 2005,因为内置的Web服务器是以非高级权限运行的。而且这个步骤也只有在本地连接,运行/调试IIS时才需要。

我们将会更新Visual Studio 2005来提供更准确的错误消息,在将来,会以更自然的方式来向你指明以上的步骤。在目前,只要使用上面这些步骤,就可以搞定了。

希望本文对你有所帮助,

Scott

标签:, , ,
 
(思归译)

posted on 2006-09-20 03:50:00 by scottgu  评论(9) 阅读(8968)

编程定制SharePoint 2007的Web Parts

【原文地址】Writing Custom Web Parts for SharePoint 2007
【原文发表日期】Saturday, September 02, 2006 10:46 AM

Sahil Malik最近发布了一篇好文章,介绍了如何使用ASP.NET 2.0来定制web part以及如何在SharePoint 2007中使用它。

正如我以前的一篇文章中提到的那样,SharePoint 2007 是建立在ASP.NET 2.0之上的, 这就意味著当你构建SharePoint站点的时候就可以使用ASP.NET 2.0的特性,譬如表单认证(Forms Authentication),母板页(Master Pages),成员(Membership),网址导航(Site Navigation),以及新的数据控件(Data Controls)等等)。无论对新的Windows SharePoint Services 3.0版本(将可以免费下载)还是Microsoft Office SharePoint Server 2007 (需要花钱购买),这都是正确的。

对开发人员来说,一个很酷的情形就是,你可以创建自定义的Web Part 控件,然后既能用于SharePoint站点,也能用于平常的单纯ASP.NET 2.0应用程序中。这让你能够重用所有这些内置的SharePoint特性,将它们用于协作,文档共享和内容管理。与此同时,你还可以添加自己定制的UI和行为,例如,假如你想把定制数据编辑和报表整合到一个网站上。

Sahil的上述文章描述了如何创建一个Web Part控件,这个控件是经编译的定制控件。现在你也能用ASP.NET的用户控件(.ascx文件)来创建Web Parts──这使得组合和封装UI功能变得更容易。一些网友在我上一篇博客帖子的评论中询问我:是否可能将以ASP.NET 2.0用户控件的形式创建的Web Parts使用于SharePoint 2007中?为此我和SharePoint产品组校对过,他们告诉我他们将支持这个情形,你可以通过添加一个附加的组件到SharePoint中的方式来实现。他们将在今年晚些时候发布一个白皮书和一个介绍怎么做的例子。

这个Channel9上的SharePoint产品组的录像,提供了SharePoint2007中一些很酷的新特性的详细信息,包括它对Wiki特性的支持。Mark Kruger在这里提供了有关SharePoint的好文章的列表。Sahil写了许多非常好的博客帖子,列举如下,它们讨论了一些定制/开发SharePoint的场景,你也许想查看一下:

Fritz Onion上个月写了一篇非常好的文章,讨论了在ASP.NET中,如何利用新的异步特性来在Web Part控件中实现高效的网络调用,而不阻塞当前的请求处理线程。这允许你同时从多个不同的web part中执行多个网络请求,并且更快更高效地呈现页面。

希望本文对你有所帮助,

Scott

标签: ,
 
(Ring译)

posted on 2006-09-19 10:07:00 by scottgu  评论(5) 阅读(8509)

在ASP.NET中使用LINQ(第一部分)

【原文地址】Using LINQ with ASP.NET (Part 1)
【原文发表日期】Sunday, May 14, 2006 9:49 PM

最近使我激动不已的新鲜事之一就是LINQ系列技术的出现,包括LINQ,DLINQ,XLINQ和不久后的其他技术。

 

LINQ将被完全集成到代号为Orcas的下个版本Visual Studio中,而且它也包含了一些非常酷的框架和 工具支持,包括完全的智能感知和可视化设计器支持。你可以在这儿下载上周发布的LINQ五月份CTP版。这个CTP版 本的亮点就是它能在VS 2005上运行,使你能够立即开始深入研究LINQ。它实现了很多用户的反馈(例 如:在DLINQ中添加了对存储过程的支持),并且包含了一个内置的ASP.NET网站项目模板来帮助你在ASP.NET 中使用它(注意:你也可以在VS 2005 Web Application Project 中使用LINQ)。

 

我将在接下来的几周中发表一系列文章来介绍怎样在ASP.NET工程 中使用LINQ/DLINQ/XLINQ。下面这第一个走过场的示范将帮助你了解一些LINQ重要的基本概念。你可以下 载LINQ五月份CTP版,然后随着文章的进行逐步输入相应代码(在下面我会列出所有代码),或者你也可以 在这儿下载并运行我所做示例的 完整.zip文件(注意:你仍然需要下载LINQ五月份版来运行.zip文件中的示 例)。

 

注意:C#和VB都完全支持LINQ,DLINQ和XLINQ。在下面的示例中 我将使用C#。

 

第0步:建立一个C# LINQ ASP.NET网站

 

建立一个能使用LINQ/DLINQ/XLINQ和新的C#3.0语言特性的ASP.NET网站,在VS中选择文件->新建网站然后选 择"LINQ ASP.NET Web Site Template":

 

 

默认会创建一个如下所示的网站 工程:

 

 

 

注意它在\bin文件夹中引入了一些LINQ程序集。它同样在web.config文件中添加了一些配置以告诉VS和ASP.NET 使用C# 3.0编译器来编译和运行程序:

 

    <system.codedom>

      <compilers>

        <compiler language="c#;cs;csharp"       

               & nbsp;  extension=".cs"

                   type="Microsoft.CSharp.CSharp3CodeProvider, CSharp3CodeDomProvider"/>

      </compilers>

    </system.codedom>

 

注意C# 3.0编译器和CodeDOM提供器可以和C# 2.0版本并肩运行, 因此你无需担心安装LINQ会破坏VS或ASP.NET。

 

第一步:建立第一个使用了LINQ的ASP.NET页 面

 

新建一个叫Step1.aspx的新页面。添加一个GridView控件到页面中,如下所 示:

 

<%@ Page Language="C#" CodeFile="Step1.aspx.cs" Inherits="Step1" %>

 

<html>

<body>

    <form id="form1" runat="server">

    <div>

   

        <h1>City Names</h1>

   

        <asp:GridView ID="GridView1" runat="server">

        </asp:GridView>

   

    </div>

    </form>

</body>

</html>

 

然后在后台代码文件中我们将编写经典的“hello world”LINQ示例-包括对一列字符串的搜索和排 序:


using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Query;

 

public partial class Step1 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        string[] cities = { "London", "Amsterdam", "San Francisco", "Las Vegas",

               & nbsp;            "Boston", "Raleigh", "Chicago", "Charlestown",

               & nbsp;            "Helsinki", "Nice", "Dublin" };

 

        GridView1.DataSource = from city in cities

               & nbsp;               where city.Length > 4

               & nbsp;               orderby city

               & nbsp;               select city.ToUpper();

 

        GridView1.DataBind();

    }

}

 

 

在上面的示例中,我列出了一组我今年一月到五月所去过的城市的名称。然后我用LINQ查询表达式(query expression)对这个数组进行操作。这个查询表达式返回名字多于4个字符的所有城市,然后按照城市名 称的字母进行排序并把名字转换为大写。

 

LINQ查询返回如下类型:IEnumerable<T>-"select"子句选择的对象类型决定了这里 的<T>的类型。因为上面例子中"city"是一个字符串,所以类型安全的结果是一个如下所示的基于泛型 的集合:

 

        IEnumerable<string> result = from city in cities

               & nbsp;                     where city.Length > 4

               & nbsp;                     orderby city

               & nbsp;                     select city.ToUpper();

 

 

因为ASP.NET控件能绑定到任何的IEnumerable集合,所以我们可以很容易的把LINQ查询结果绑定到GridView中, 然后调用DataBind()方法来生成如下的页面输出:

 

 

注意,除了可以使用上面的GridView控件外,我也可以使用 <asp:repeater>, <asp:datalist>, <asp:dropdownlist>, 或者任何其他ASP.NET的列表 控件(可以是产品自带或者开发人员自己开发的控件)。在这些示例中我只使用了<asp:gridview>-但 是你们可以使用任何其他的控件。

 

第二步:使用功能更丰富的集合

 

搜索一个数组的字符串并没多大意思,虽然有时候很有用。如果我们能对自己的功能更丰富的那些集合中搜索将 会更有趣。好消息是,LINQ使这些变得很简单。例如,为了更好记录我去过的地方,我在我的工程中建立了一 个叫"Location"的简单类:

 

using System;

 

public class Location

{

    // Fields

    private string _country;

    private int    _distance;

    private string _city;

 

    // Properties

    public string Country

    {

        get { return _country; }

        set { _country = value; }

    }

 

    public int Distance

    {

        get { return _distance; }

        set { _distance = value; }

    }

 

    public string City

    {

        get { return _city; }

        set { _city = value; }

    }

}

 

它公开了三个属性来表示国家、城市名称和到西雅图的距离。然后我新建一个包含GridView控件的Step3.aspx页 面,其中GridView定义了三列,如下所示:

 

<%@ Page Language="C#" CodeFile="Step2.aspx.cs" Inherits="Step2" %>

 

<html>

<body>

    <form id="form1" runat="server">

 

    <h1>Cities and their Distances</h1>

   

    <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">

       <Columns>

          <asp:BoundField HeaderText="Country" DataField="Country" />

          <asp:BoundField HeaderText="City" DataField="City" />

          <asp:BoundField HeaderText="Distance from Seattle" DataField="Distance" />

       </Columns>

    </asp:GridView>

   

    </form>

</body>

</html>

 

然后我建立一个Location对象集合来绑定到Grid中,后台代码文件如下所示:

 

using System;

using System.Collections.Generic;

using System.Web;

using System.Query;

 

public partial class Step2 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        List<Location> cities = new List<Location>{

               & nbsp;               & nbsp;    new Location { City="London", Distance=4789, Country="UK" },

               & nbsp;               & nbsp;    new Location { City="Amsterdam", Distance=4869, Country="Netherlands" },

               & nbsp;               & nbsp;    new Location { City="San Francisco", Distance=684, Country="USA" },

               & nbsp;                    new Location { City="Las Vegas", Distance=872, Country="USA" },

               & nbsp;               & nbsp;    new Location { City="Boston", Distance=2488, Country="USA" },

               & nbsp;               & nbsp;    new Location { City="Raleigh", Distance=2363, Country="USA" },

               & nbsp;               & nbsp;    new Location { City="Chicago", Distance=1733, Country="USA" },

               & nbsp;               & nbsp;    new Location { City="Charleston", Distance=2421, Country="USA" },

               & nbsp;               & nbsp;    new Location { City="Helsinki", Distance=4771, Country="Finland" },

               & nbsp;               & nbsp;    new Location { City="Nice", Distance=5428, Country="France" },

               & nbsp;               & nbsp;    new Location { City="Dublin", Distance=4527, Country="Ireland" }

               & nbsp;                };

 

        GridView1.DataSource = from location in cities

               & nbsp;               where location.Distance > 1000

               & nbsp;               orderby location.Country, location.City

               & nbsp;               select location;

 

        GridView1.DataBind();

    }

}

 

上面的后台代码展示了几个非常酷的特性。首先是C# 3.0新的简便的构造器写法,在创建对象的同时,还可以同 时设置这些对象的属性的值:: 

 

new Location { City="London", Distance=4789, Country="UK" }

 

 

这在实例化和同时添加对象到集合中的情形下非常有用,以及在 后面将用到的匿名类型的情形中也非常有用。注意到我这次并没有用数组,而是用了一个类型为Location的基 于泛型的List集合。LINQ支持对任何的IEnumerable<T>集合执行查询,所以你可以使用现有的任何泛型 或者非泛型的对象集合。

 

在下面的LINQ查询中我返回了距离西雅图超过100英里的城市的集合。我还选择了对查询进行先国家后城市名称 的排序操作。这个LINQ查询的结果的类型是由location变量来确定下来的─在这里,其类型 是Location:

 

        IEumerable<Location> result = from location in cities

               & nbsp;                      where location.Distance > 1000

               & nbsp;                      orderby location.Country, location.City

               & nbsp;                      select location;

 

当我把结果绑定到GridView中将会得到如下结果:

 

 

第三步:稍微重构一下City集合

 

因为我们将在好几个示例中重用这个城市集合,我决定把它封装到一个"TravelOrganizer"类中,如下所 示:

 

using System;

using System.Collections.Generic;

 

public class TravelOrganizer

{

    public List<Location> PlacesVisited

    {

        get

        {

            List<Location> cities = new List<Location>{

               & nbsp;               & nbsp;        new Location { City="London", Distance=4789, Country="UK" },

               & nbsp;               & nbsp;        new Location { City="Amsterdam", Distance=4869, Country="Netherlands" },

               & nbsp;               & nbsp;        new Location { City="San Francisco", Distance=684, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Las Vegas", Distance=872, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Boston", Distance=2488, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Raleigh", Distance=2363, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Chicago", Distance=1733, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Charleston", Distance=2421, Country="USA" },

               & nbsp;               & nbsp;        new Location { City="Helsinki", Distance=4771, Country="Finland" },

               & nbsp;                        new Location { City="Nice", Distance=5428, Country="France" },

               & nbsp;               & nbsp;        new Location { City="Dublin", Distance=4527, Country="Ireland" }

               & nbsp;               & nbsp;    };

 

            return cities;

        }

    }

}

 

 

这使我只需要编写如下的代码就能得到跟上面同样的结果:

 

using System;

using System.Collections.Generic;

using System.Web;

using System.Web.UI;

using System.Query;

 

public partial class Step3 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        TravelOrganizer travel = new TravelOrganizer();

 

        GridView1.DataSource = from location in travel.PlacesVisited

               & nbsp;               where location.Distance > 1000

               & nbsp;               orderby location.Country, location.City

               & nbsp;               select location;

 

        GridView1.DataBind();

    }

}

 

LINQ很酷之处就是它是强类型的。这意味着,

 

1) 你的所有的查询都会进行编译时检查。不像现在的SQL语句,你只有到运行时才会发现你的错误所 在。这意味着你在开发时就可以检查你的代码的正确性,例如,如果我把上面的"distance"误写成 了"distanse",编译器将为我捕获到这个错误。

 

2) 当你写LINQ查询的时候你将在VS或免费的Visual Web Developer中获得智能感知的提示。这不仅加 快了编码的输入速度,而且使我们在处理无论简单还是复杂的集合和数据源对象模型时都变得非常容 易。

 

第四步:使用.NET的标准查询操作符做Skip和Take操 作

 

LINQ支持许多内置的标准查询操作。如果你在类之前加入"using System.Query"语句你就可以在代码 中使用这些操作。例如,如果我要列出第2远到第6远的城市,我就可以使用象下面这样的编 码:

 

using System;

using System.Web.UI;

using System.Query;

 

public partial class Step4 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        TravelOrganizer travel = new TravelOrganizer();

 

        GridView1.DataSource = (from location in travel.PlacesVisited

               & nbsp;               orderby location.Distance descending

               & nbsp;               select location).Skip(1).Take(5);

 

        GridView1.DataBind();

    }

}

 

注意我是怎么通过距离的远近来对结果进行排序的。然后我使 用Skip操作来跳过第一个城市,然后使用Take操作来只返回5个结 果。

 

NET标准查询操作的真正强大之处在于,这些操作不是写死 的(hard-coded ),任何开发人员都可以添加新的或替换其中的操作。这就可以支持实现非常强有力的特定 域(domain specific)操作。例如,当你在DLINQ里使用Skip和Take操作时,DLINQ实际上是把这些操作转换成 服务器端分页的后台SQL逻辑,这样,只有少量的记录从数据库返回,不管数据表中是否有十几万条数据。这 意味着我们可以在大量关系数据之上很轻易地实现高效的web数据分页。注意:在LINQ正式发行之前,你可以 使用这里提到的技术。

 

第五步:.NET的标准查询操作续

 

除了可以返回数据集之外,我们可以使用.NET标准查询操作来返回单个或者统计数据结果。下面的例子演示了怎 么做:

 

<%@ Page Language="C#" CodeFile="Step5.aspx.cs" Inherits="Step5" %>

 

<html>

<body>

    <form id="form1" runat="server">

    <div>

        <h1>Aggregate Value Samples</h1>

       

        <div>

            <b>Farthest Distance City:</b>

            <asp:Label ID="MaxCityNameTxt" runat="server" Text="Label"></asp:Label>

            <asp:Label ID="MaxCityDistanceTxt" runat="server" Text="Label"></asp:Label>

        </div>

       

        <div>

            <b>Total Travel Distance (outside of US):</b>

            <asp:Label ID="TotalDistanceTxt" runat="server" Text="Label"></asp:Label>

        </div>       

       

        <div>

            <b>Average Distance:</b>

            <asp:Label ID="AverageDistanceTxt" runat="server" Text="Label"></asp:Label>

        </div>       

       

    </div>

    </form>

</body>

</html>

 

Step5.aspx.cs后台代码文件:

 

using System;

using System.Collections.Generic;

using System.Web.UI;

using System.Query;

 

public partial class Step5 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        TravelOrganizer travel = new TravelOrganizer();

 

 

        //

        // Calculate farthest city away

 

        Location farthestCity = (from location in travel.PlacesVisited

               & nbsp;               & nbsp; orderby location.Distance descending

               & nbsp;               & nbsp; select location).First();

 

        MaxCityNameTxt.Text = farthestCity.City;

        MaxCityDistanceTxt.Text = "(" + farthestCity.Distance + " miles)";

 

 

        //

        // Calculate total city distances of all cities outside US

 

        int totalDistance = (from location in travel.PlacesVisited

               & nbsp;             where location.Country != "USA"

               & nbsp;             select location).Sum(loc => loc.Distance);

 

        TotalDistanceTxt.Text = totalDistance + " miles";

 

 

        //

        // Calculate average city distances of each city trip

 

        double averageDistance = travel.PlacesVisited.Average(loc => loc.Distance);

 

        AverageDistanceTxt.Text = averageDistance + " miles";

    }

}

 

注意,上面最后两个例子使用了新的Lambda表达式(Lambda Expression)支持-这些表达式允许我们通过譬如象 委托这样的代码段在数据之上做进一步的操作,从而计算出一个结果来。你也可以用之来建立你自己的.NET查 询操作(例如:你可以建立一些特定领域的查询来计算运费或者收入税)。所有的对象都是强类型的,而且支 持智能感知和编译时检查。

 

上面示例的输出如下所示:

 

 

第六步:匿名类型(Anonymous Types)

 

LINQ能够利用的另一个C#和VB新特性之一就是对“匿名类型”的支 持。这允许你不需明确声明对象模型就能很容易地创建和使用内联的类型结构,因为类型可以通过数据的初始 化推断出来。这在使用LINQ查询“自定义构形(custom shape)”数据时非常的有 用。

 

例如,考虑这样一个场景:你正在处理一个具有许多属性的数据库或者强类型的集合-但是你只关心其中少数的 几个字段。与创建和处理整个类型相比,仅返回你所需要的字段将会更加有用些。我们来新建一 个"step6.aspx"文件来实现以上操作:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Step6.aspx.cs" Inherits="Step6" %>

 

<html>

<body>

    <form id="form1" runat="server">

    <div>

       

        <h1>Anonymous Type</h1>

   

        <asp:GridView ID="GridView1" runat="server">

        </asp:GridView>

       

    </div>

    </form>

</body>

</html>

 

在我们的后台代码文件中我们将编写一个使用匿名类型的LINQ查询,如下所 示:

 

using System;

using System.Web.UI;

using System.Query;

 

public partial class Step6 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        TravelOrganizer travel = new TravelOrganizer();

 

        GridView1.DataSource = from location in travel.PlacesVisited

               & nbsp;               orderby location.City

               & nbsp;               select new {

               & nbsp;               & nbsp;    City = location.City,

               & nbsp;               & nbsp;    Distance = location.Distance

               & nbsp;               };

          

        GridView1.DataBind();

    }

}

 

注意,我们并没有像上面一样从select子句中返回一个"location"对象,我们通过新建一个具有City和Distance 两个属性的匿名类型来实现。这两个属性的类型是根据它们初始化时赋与的值来自动确定的,在这里是一个是 string,另一个是int。将其绑定到GridView时,将产生如下输出:

 

 

第七步:匿名类型续

 

前面的示例展示了一个使用匿名类型来自定 义LINQ查询输出的基本例子。下面的示例提供了一个更复杂和更实际的场景。它把我们的城市列表转换成一个分层的结果集合──我们将使用一个匿名类型来对结果按国家分组,这个匿名类型包含了一个国家名称,一个城 市详细信息的子集合和在这个国家中所有城市距离的总和,这距离之和将通过第五步中示范过的lambda表达式 来计算:

 

using System;

using System.Web.UI;

using System.Query;

 

public partial class Step7 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        TravelOrganizer travel = new TravelOrganizer();

 

        GridView1.DataSource = from location in travel.PlacesVisited

               & nbsp;               group location by location.Country into loc

               & nbsp;               select new {

               & nbsp;               & nbsp;   Country = loc.Key,

               & nbsp;               & nbsp;   Cities = loc,

               & nbsp;               & nbsp;   TotalDistance = loc.Sum(dist => dist.Distance)

               & nbsp;               };

          

        GridView1.DataBind();

    }

}

 

我们.aspx页面中的GridView是这样定义的:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Step7.aspx.cs" Inherits="Step7" %>

 

<html>

<body>

    <form id="form1" runat="server">

    <div>

        <h1>Groupings with Anonymous Classes</h1>

 

        <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">

            <Columns>

           

                <asp:BoundField HeaderText="Country" DataField="Country" />

           

                <asp:TemplateField HeaderText="Cities">

               & nbsp;    <ItemTemplate>

               & nbsp;   

               & nbsp;        <asp:BulletedList ID="BulletedList1" runat="server"

               & nbsp;               & nbsp;          DataSource='<%#Eval("Cities")%>' DataValueField="City"/>

               & nbsp;   

               & nbsp;    </ItemTemplate>

                </asp:TemplateField>

           

                <asp:BoundField HeaderText="Total Distance" DataField="TotalDistance" />

           

            </Columns>

        </asp:GridView>

    </div>

    </form>

</body>

</html>

 

注意,我在GridView的模版列中添加了一个"Cities"列,并且在其中添加了一个<asp:bulletedlist>控件 (一个新的ASP.NET 2.0自带控件)来绑定在上面用LINQ查询所得到的分层结果。生成的输出如下所 示:

 

 

注意,所有上面的绑定语法和层次绑定在现在的ASP.NET 2.0中是完全支持的,所以,你可以在现有的程序中使 用这些技术。新颖(我也认为非常酷)之处,是匿名类型和LINQ提供的数据构形功能,这个功能使得在ASP.NET 控件里绑定分层数据非常容易。

 

下一步

 

上面所有的例子操作的都是本地内存中的集合数据。他们展示了你如何在.NET对象模型中使用LINQ,包括那些你 自己创建的类型。

 

在我将来的有关LINQ的文章中,我将深入讨论LINQ,利用新的DLINQ支持使用上面提到的技术来处理关系数据库 ,和通过新的XLINQ支持来处理XML文件和结构。LINQ项目的好处在于,在所有的应用中,其句法和概念都是一 样的,这样,你一旦学会使用LINQ对一个数组或集合做查询,你也就知道了在处理数据库甚至XML文件时所需 的所有概念。

 

例如,假如你使用DLINQ生成了Northwinds数据库中供应商(Suppliers)和产品( Products)表相对应的.NET类型 (注:你不需要编写任何代码就可以实现),那么要获取分层的数据结果,并且将其绑定到GridView上,你只 要写下面这个编码就可以了(注意:我们使用了跟前面的例子一样的数据构形技术,只从数据库中取得两列数 据,并且自动地把每个供应商和其对应的产品组合成一个层次结构的结 果):

 

using System;

using System.Query;

 

public partial class Data_Data2 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Northwind db = new Northwind();

 

        GridView1.DataSource = from x in db.Suppliers

               & nbsp;               where x.Country == "USA"

               & nbsp;               orderby x.Country

               & nbsp;               select new {

               & nbsp;               & nbsp;    x.CompanyName,

               & nbsp;               & nbsp;    x.Country,

               & nbsp;               & nbsp;    x.Products

                        & nbsp;      };

 

        GridView1.DataBind();

    }

}

 

不需要额外的SQL语句和代码──这些就是实现高效获取和组装层次数据所需的所有代码(注意:只取出了需要的 列和行的数据-DLINQ可以使用LINQ的远程函数支持因而我们没必要持久化或者取出所有数据库表或者一行中 的所有列)。而且这些都是类型安全的,同样具有完全的编译时检查,智能感知和调试支 持。

 

更棒的是,接入一个新的LINQ提供器(DLINQ和XLINQ是两例)的机制是完全公开的──因此那些已经建立或者使用现 有数据提供程序(例如:O/R数据库映射)的开发人员可以很容易的无缝地把他们的实现和LINQ整合起来。一 旦你了解了LINQ,你就知道了开发LINQ所需的所有的基本知识。

 

总结

 

本文对一些即将到来的非常酷的技术做了一个比较粗略的概述。你可以从这儿下载LINQ五月份CTP版来尝试一下。你也可以 在这儿下载并运行我在上面所建 示例的.zip文件。

 

希 望本文对你有所帮助,

 

Scott

 

标签: , , , ,
 
(蓝天译)

posted on 2006-09-18 12:07:00 by scottgu  评论(24) 阅读(22295)

技巧和诀窍:在ASP.NET AJAX UpdatePanel中实现对后退/前进按钮的支持

【原文地址】Tip/Trick: Enabling Back/Forward-Button Support for ASP.NET AJAX UpdatePanel
【原文发表日期】Thursday, September 14, 2006 12:25 PM

Nikhil最近写了一个好帖子,是关于一个叫做HistoryControl的支持AJAX的新ASP.NET 控件的。把它加到页面上后,允许开发人员用编程手段往浏览器的历史记录里添加逻辑视图(logical view)。这将使得支持AJAX的网站更加有用,而且遵循传统web应用所遵循的标准的前进/后退的导航惯例。

譬如,通过Nikhil的HistoryControl,开发人员可以编写类似下面这样的编码来响应一个列表的选择变动,并且把列表选择当作标识符添加到浏览器的历史记录中去:

private void ContentList_SelectedIndexChanged(object sender, EventArgs e) {
   history.AddEntry(contentList.SelectedIndex.ToString()
;
}

你一旦往历史控件里添加新项后,浏览器中的后退/前进按钮就被激活了。Nikhil的历史控件提供了一个Navigate事件,当你在浏览器里按后退/前进按钮时,这个事件就会被触发,同时它在事件处理函数的参数里提供了早先在把逻辑视图添加进浏览器历史记录时所用的那个标识符。然后你就可以使用这个标识符来把页面回复到跟这个历史记录相对应的页面状态了:

private void HistoryControl_Navigate(object sender, HistoryEventArgs e) {

    
int selectedIndex 0;

    if 
(String.IsNullOrEmpty(e.Identifier) == false) {
        selectedIndex 
Int32.Parse(e.Identifier);
    
}

    
// Update the content being displayed in the page
    
contentList.SelectedIndex selectedIndex;

    
// Mark the update panels as needing an update
    
mainUpdatePanel.Update();
}

这样你的用户在使用AJAX应用时也能使用前进/后退按钮来作导航了。你可以在这里下载Nikhil的历史控件的编码,开始用在你的项目里

希望本文对你有所帮助,

Scott

标签:, , ,

(思归译)

posted on 2006-09-15 09:46:00 by scottgu  评论(7) 阅读(8119)

8月9日asp.net文章链接列表

【原文地址】August 9th ASP.NET Link-Listing
【原文发表日期】Wednesday, August 09, 2006 1:24 AM

下面是我上周从网站上找到的一些我喜欢的非常好的文章和链接,我建议大家能够留出时间阅读他们: :

ASP.NET话题

使用ASP.NET 2.0发送邮件: 这是来源于Scott Mitchell的一篇好文章。他演示了如何从ASP.NET应用程序中使用.NET 2.0中的System.Net.Mail APIs发送邮件。 .

用ASP.NET 2.0发送邮件:HTML格式的邮件,附件以及如何优雅地处理SMTP异常: 这是来源于Scott Mitchell的有关发送邮件的一篇很好的续文,文章讨论了有关System.Net.Mail的一些更高级的使用场景。

UrlRewritingNet.UrlRewrite V2.0发布: 周五,Albert Weinert给我发邮件告诉我关于发布了UrlRewriting引擎最新版本的消息。UrlRewriting引擎是由他和Thomas Bandt为ASP.NET技术而写的。它供免费下载,包括例子和所有的源代码。 .

在不结合Data Source控件的情形下使用GridView控件: 已经有很多的好文章介绍了有关如何结合ASP.NET 2.0 data source控件模型来使用ASP.NET 2.0的GridView控件。 在这篇文章中,Bipin Joshi介绍了如何直接使用GridView编程,而不结合使用DataSource控件,即,直接写编码实现绑定,分页,排序等等。

在.NET中使用FlickR: 在这篇文章中,Sam Judson讨论了在.NET应用程序中如何使用FlickR提供的photo-service API编程。它允许你建立自己的照片浏览程序,以及如何向Yahoo的FlickR服务用编程手段实现上传。.

借助WebResource.axd,通过URL访问内嵌的(Embedded)资源: ASP.NET 2.0引进了一个非常有用的,称为"WebResource.axd"的特性。它可以让你避免以众所周知的目录形式手工部署脚本和图片资源,即,不再使用/aspnet_client/虚拟目录等方式的部署。Scott Mitchell在文章中介绍了它的工作原理,并且介绍了怎么利用这个特性在你自己的控件和组件里内嵌文件资源。.

ASP.NET案例研究:Session变量的丢失和AppDomain的回收: Tess出色的细解ASP.NET调试的系列帖子的又一篇,深入探讨ASP.NET中App-domains的工作原理,以及它们如何被回收以及为什么会被回收的秘密。

VS 2005 话题

在VS 2005 ASP.NET项目中如何定制组合相关文件: Visual Studio提供了在解决方案浏览器中,将某些类型的文件嵌套在其他文件下的内置支持。例如,在解决方案浏览器中,.aspx页面的代码后置文件是作为页面的子项显示的。在这篇博客帖子中,James Hebben介绍了一个灵巧的使用注册表的技巧,可以让你在VS2005中将任何文件嵌套在另外的一个文件下。他示范的例子非常有用,描述了怎么将一个特定内容的.js文件嵌套在页面或控件下。

Visual Studio 2005中的MSBuild: 这个分为13部分的系列文章描述了Visual Studio 2005中新的MSBuild build系统是如何工作的。说明一下,在VS 2005 Web应用程序项目VS 2005 Web部署项目中,MSBuild都能被使用。

将来的酷技术

Windows Workflow Foundation编程初介: Sahil Malik已经发布了几篇很酷的文章,这些文章演示了如何使用新工作流特性,这些特性将在今年秋天伴随着.NET3.0一起发布。工作流能让你以非常灵活的方式构建一系列组合操作(这样你就可以避免在逻辑中硬编码)。这个hello-world例子(以及其内链接的早期帖子)提供了深入研究这个新技术的一个捷径。

希望本文对你有所帮助,

Scott

标签: , ,
 
(Ring译)

posted on 2006-09-13 13:15:00 by scottgu  评论(4) 阅读(6710)

【第1页/共2页,15条】
首页
前页
1