﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-技术备忘录</title><link>http://www.cnblogs.com/cunet/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Oct 2008 09:18:10 GMT</lastBuildDate><pubDate>Sun, 12 Oct 2008 09:18:10 GMT</pubDate><ttl>60</ttl><item><title>关于Asp.net ajax下的异常处理</title><link>http://www.cnblogs.com/cunet/archive/2008/04/25/1171397.html</link><dc:creator>戒焦戒躁</dc:creator><author>戒焦戒躁</author><pubDate>Fri, 25 Apr 2008 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/cunet/archive/2008/04/25/1171397.html</guid><wfw:comment>http://www.cnblogs.com/cunet/comments/1171397.html</wfw:comment><comments>http://www.cnblogs.com/cunet/archive/2008/04/25/1171397.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/cunet/comments/commentRss/1171397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cunet/services/trackbacks/1171397.html</trackback:ping><description><![CDATA[　　最近做一个项目时，大量应用了Asp.net ajax，由于在UpdatePanel这种异步更新模式下，后台处理时所发生的异常并不会导致客户端的界面发生变化，而是直接以alert的方式弹出异常信息，所以我就偷了个懒，在后台检测到不符合要求的输入之类的情况下，就直接把错误提示信息throw一下就好了。但现在发现问题了，就是这样一来，如何处理其它的未处理异常？<br />
为了不至于全部重新来修改一遍，我考虑了这几种处理方式：<br />
1.在web.config的customErrors配置中设置当出现未处理的异常时转到指定页；<br />
2.在Global.asax的Application_Error事件处理程序中，将异常信息输出到指定的页面显示给客户端；<br />
3.由于我所有的页面都是继承自一个MyPage类（它又继承自System.Web.UI.Page)，所以也可以考虑在MyPage的Page_Error事件处理程序中，来将异常信息输出到指定的页面显示给客户端。<br />
<br />
但是，第一和第三种方法，会在出现异常时直接转到指定页，从而达不到直接alert错误提示的效果；而第二种方法，倒是不会管这种异步的程序异常，不会把页面重定向，但在Application_Error里面用Server.GetLastError()方法捕获的异常很多时候又不是直接的包含了友好错误信息的那个异常，而是它所导致的异常，比如经常就会导致System.Web.HttpUnhandledException异常。所以这种方式也不理想。<br />
<br />
因此，想和园子里各位高人探讨一下如何在利用了Asp.net ajax这种异常处理的便捷性的时候，能兼顾处理好其它的未处理异常（比如Page_Load里!IsPostBack的代码中出现的异常）。暂借首页宝地一用，希望能听到让人豁然开朗的高见。<br />
<img src ="http://www.cnblogs.com/cunet/aggbug/1171397.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42950/" target="_blank">[新闻]Google开拓美政府机构市场 微软业务受冲击</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>对ViewState的一点思考</title><link>http://www.cnblogs.com/cunet/archive/2007/08/24/867745.html</link><dc:creator>戒焦戒躁</dc:creator><author>戒焦戒躁</author><pubDate>Fri, 24 Aug 2007 01:19:00 GMT</pubDate><guid>http://www.cnblogs.com/cunet/archive/2007/08/24/867745.html</guid><wfw:comment>http://www.cnblogs.com/cunet/comments/867745.html</wfw:comment><comments>http://www.cnblogs.com/cunet/archive/2007/08/24/867745.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cunet/comments/commentRss/867745.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cunet/services/trackbacks/867745.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/cunet/archive/2007/08/24/867745.html'>阅读全文</a><img src ="http://www.cnblogs.com/cunet/aggbug/867745.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42949/" target="_blank">[新闻]消息称苹果正在开发iTunes网络电视</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>用Ajax保持会话</title><link>http://www.cnblogs.com/cunet/archive/2007/07/17/821411.html</link><dc:creator>戒焦戒躁</dc:creator><author>戒焦戒躁</author><pubDate>Tue, 17 Jul 2007 09:03:00 GMT</pubDate><guid>http://www.cnblogs.com/cunet/archive/2007/07/17/821411.html</guid><wfw:comment>http://www.cnblogs.com/cunet/comments/821411.html</wfw:comment><comments>http://www.cnblogs.com/cunet/archive/2007/07/17/821411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/cunet/comments/commentRss/821411.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cunet/services/trackbacks/821411.html</trackback:ping><description><![CDATA[<p>　　在一个项目中，需要让会话变量存在于页面关闭之前的整个周期内，尝试用asp.net ajax的方式来实现，代码如下所示：<br />
　　.aspx页面中，&lt;body&gt;标签：&lt;body onload="KeepActive();"&gt;<br />
　　客户端JS代码：<br />
　　function KeepActive(){<br />
　　PageMethods.KeepSession();<br />
　　setTimeout("KeepActive();",600000);<br />
　　}<br />
　　后台.cs代码：<br />
　　[System.Web.Services.WebMethod]<br />
&nbsp;&nbsp;&nbsp; 　public static void KeepSession()<br />
&nbsp;&nbsp;&nbsp; 　{<br />
&nbsp;&nbsp;&nbsp; 　}</p>
<p>　　代码的意图就是，让客户端定期调用服务端方法，从而保持会话状态不受会话超时时间设置的限制。从实际的运行效果来看，绝大部份时间是能够达到预期的目的的。但众所周知，Session在某些情况下是会丢失的，所以这种方法对Session因非超时原因而丢失还是无能为力的。<br />
　　</p>
 <img src ="http://www.cnblogs.com/cunet/aggbug/821411.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42948/" target="_blank">[新闻]微软周一开电话会议 预计将发布Silverlight2.0</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>下载最新的AjaxControlToolkit控件包</title><link>http://www.cnblogs.com/cunet/archive/2007/05/28/762637.html</link><dc:creator>戒焦戒躁</dc:creator><author>戒焦戒躁</author><pubDate>Mon, 28 May 2007 08:13:00 GMT</pubDate><guid>http://www.cnblogs.com/cunet/archive/2007/05/28/762637.html</guid><wfw:comment>http://www.cnblogs.com/cunet/comments/762637.html</wfw:comment><comments>http://www.cnblogs.com/cunet/archive/2007/05/28/762637.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/cunet/comments/commentRss/762637.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cunet/services/trackbacks/762637.html</trackback:ping><description><![CDATA[　　前些时间对AjaxControlToolkit中的部份控件感觉不甚满意，于是期盼着微软早点更新，今天去Asp.net Ajax官方网站看了一下，果然早就有更新了。最新的AjaxControlToolkit控件包下载地址是：<a href="http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=1425">http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=1425</a><br>　　里面增加了ListSearch、SlideShow等新的Ajax控件，我在<a title="对微软Asp.net Ajax 1.0的AutoComplete控件的几处修正和增强" href="http://www.cnblogs.com/cunet/archive/2007/05/25/759737.html">对微软Asp.net Ajax 1.0的AutoComplete控件的几处修正和增强</a>一文中所提到的前两个问题也在新的AutoComplete控件中得到了修正。
<img src ="http://www.cnblogs.com/cunet/aggbug/762637.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42947/" target="_blank">[新闻]开心网即将启用”shejiao.com”?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>对微软Asp.net Ajax 1.0的AutoComplete控件的几处修正和增强</title><link>http://www.cnblogs.com/cunet/archive/2007/05/25/759737.html</link><dc:creator>戒焦戒躁</dc:creator><author>戒焦戒躁</author><pubDate>Fri, 25 May 2007 06:39:00 GMT</pubDate><guid>http://www.cnblogs.com/cunet/archive/2007/05/25/759737.html</guid><wfw:comment>http://www.cnblogs.com/cunet/comments/759737.html</wfw:comment><comments>http://www.cnblogs.com/cunet/archive/2007/05/25/759737.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/cunet/comments/commentRss/759737.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/cunet/services/trackbacks/759737.html</trackback:ping><description><![CDATA[<p>　　随Asp.net Ajax 1.0发布的AjaxControlToolkit系列控件给开发人员带来了很多便利，但其中很多控件似乎并没有我们想像的那么完美。最近对这里面的AutoComplete控件用得较多，发现了它的几个不足或错误之处：<br>　　1.在某些情况下会出现&#8220;two components with the same id&#8221;的错误；<br>　　2.容易导致在IE中出现&#8220;无法打开Internet站点，&#8230;，已终止操作&#8221;的问题；<br>　　3.即使用户输入了很多的字符，即使已经没有相匹配的结果，它仍然会调用服务端方法，试图获取相匹配的值，白白增加了服务器的负担；<br>　　4.自动完成列表的样式不太好看；<br>　　5.服务端方法的签名必须是：string[] GetCompletionList(string prefixText, int count)，无法从客户端取得其它需要的数据。这一点在一个页面中有多个需要从不同数据源获取数据的AutoComplete控件时尤其致命。</p>
<p>　　要解决这些问题，首先需要知道怎样来修改相应的代码并使之在自己的应用中生效。值得庆幸的是，AjaxControlToolkit系列控件是开源的，所以我们可以根据自己的需要来尽情修改。用VS2005打开AjaxControlToolkit解决方案，打开AutoComplete文件夹中的AutoCompleteBehavior.js文件，修改并重新编译后，将生成的AjaxControlToolkit.dll文件更新到自己的项目引用中，即可应用我们优化和增强后的AutoComplete控件了。</p>
<p>　　那么，具体需要修改哪些代码呢？<br>　　针对第一个问题，需要在AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');这一行之前加上：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_33_126_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_126_Open_Text.style.display='none'; Codehighlighter1_33_126_Closed_Image.style.display='inline'; Codehighlighter1_33_126_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_33_126_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_126_Closed_Text.style.display='none'; Codehighlighter1_33_126_Open_Image.style.display='inline'; Codehighlighter1_33_126_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">._popupBehavior)&nbsp;</span><span id=Codehighlighter1_33_126_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_33_126_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">._popupBehavior.dispose();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">._popupBehavior&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>　　第二个问题，要将document.body.appendChild(this._completionListElement);这一行修改为&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.parentNode.appendChild(this._completionListElement);</p>
<p>　　第三个问题，需要在_onTimerTick方法中，为if (text.trim().length &lt; this._minimumPrefixLength) 这个判断增加一个条件，变成：if (text.trim().length &lt; this._minimumPrefixLength || text.trim().length &gt; 10) ，这就使得，当用户的输入超过10个字符时，就不必向服务端调用读取匹配值的方法了。</p>
<p>　　第四个问题，要调整自动完成列表的样式，可以直接修改initializeCompletionList方法中的以下代码：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.backgroundColor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">._textBackground;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.color&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">._textColor;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.border&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;'solid&nbsp;1px&nbsp;buttonshadow';<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.cursor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;'</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">';<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.unselectable&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;'unselectable';<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completionListStyle.overflow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;'hidden';</span></div>
<p><br>，或者删除这几行，并添加：element.className = "completionList";然后在页面上添加样式类&#8220;completionList&#8221;的定义即可；</p>
<p>　　要解决最后一个问题，应该在 { prefixText : this._currentPrefix, count: this._completionSetCount}这一行中增加一个发给服务器的参数，变为:<br>　　{ prefixText : this._currentPrefix, count: this._completionSetCount , srcId: this.get_element().getAttribute("srcid") }<br>　　从而，服务端的读取自动完成列表项的方法签名就可以写成：string[] GetCompletionList(string prefixText, int count ,string srcId)。这意味着，我们可以为需要应用自动完成功能的文本框预先设置一个用于标识其数据来源的标识字符串，C#代码如：tb.Attributes.Add("srcid", "xxx"); 然后，在GetCompletionList方法中就可以根据客户端传过来的这个参数值来有针对性地读取数据了。</p>
<img src ="http://www.cnblogs.com/cunet/aggbug/759737.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42945/" target="_blank">[新闻]Google股价跌破329美元 61%员工期权价值归零</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>