<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Warmth &amp; Chilliness</title><subtitle type="text">i miss u now, where a u go away...</subtitle><id>http://feed.cnblogs.com/blog/u/4468/rss</id><updated>2012-01-26T03:53:32Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/4468/rss"/><entry><id>http://www.cnblogs.com/think8848/archive/2012/01/13/2321712.html</id><title type="text">MySQL的DataConnectionDialog</title><summary type="text">这两天做一个小工具，需要让用户提供数据库连接字符串，锉方法是让用户输入一个字符串，稍好点方式的是提供一个字符串让用户去改，更好呢，就是提供一个像VS中那样一个可以生成数据库连接字符串的对话框了。从很久以前开始，M$就提供了这样的组件，我至少在VS的安装目录下发现了两个Assembly中包含了DataConnectionDialog，分别是：C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.Data.ConnectionUI.Dialog.dll和C:\Program Files\Microsoft Visua</summary><published>2012-01-13T07:42:00Z</published><updated>2012-01-13T07:42:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2012/01/13/2321712.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2012/01/13/2321712.html"/><content type="html">&lt;p&gt;这两天做一个小工具，需要让用户提供数据库连接字符串，锉方法是让用户输入一个字符串，稍好点方式的是提供一个字符串让用户去改，更好呢，就是提供一个像VS中那样一个可以生成数据库连接字符串的对话框了。从很久以前开始，M$就提供了这样的组件，我至少在VS的安装目录下发现了两个Assembly中包含了DataConnectionDialog，分别是：C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.Data.ConnectionUI.Dialog.dll和C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Microsoft.VisualStudio.Data，但是今天我们不使用这两种方式，为啥咧？原因是他们里面没有带MySQL类型的数据源，虽然也可以通过不算十分复杂的过程将MySQL加进来，但是对于懒人来说，什么都不做岂不更好，我正好就是个懒人，在允许的情况下，我更愿意让脑神经放松下来，去干点更值当点的工作。&lt;/p&gt;&#xD;
&lt;p&gt;最初觉得既然使用了MySQL Connector/Net，那这个Dialog就应该是在MySql.Data.dll中了，但是一阵好找发现这个MySql.Data命名空间下，连个继承Form的类都没有，貌似不可能提供这种对话框的功能了，无奈之下想起了MySql Connector/Net应该是提供源代码的，于是到MySql的官网上下载了一份源代码，看看到底内部是怎么做的，很失望，依然是没有找到，不过在这份源代码的解决方案中发现了一个未能正常加载的项目，MySql.VisualStudio!哈哈，看着名字就像，按常理来说，应该有个MySql.VisualStudio.dll存在某处，F3一下，果然，在C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Oracle\MySQL Connector Net\6.4.4文件夹中找到了，于是赶紧引用到项目中，一试，果然获得了MySql的连接字符串&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/1781/2012011315392593.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;示例代码：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;private void btnConnect_Click(object sender, EventArgs e)&#xD;
        {&#xD;
            ConnectDialog dialog = new ConnectDialog();&#xD;
&#xD;
            dialog.StartPosition = FormStartPosition.CenterScreen;&#xD;
&#xD;
            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)&#xD;
            {&#xD;
                try&#xD;
                {&#xD;
                    txtConnect.Text = dialog.Connection.ConnectionString;&#xD;
                }&#xD;
                catch&#xD;
                {&#xD;
                }&#xD;
            }&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这里稍值得说明的是为啥要放在一个try里呢，原因是，当你点击了"Connect"按钮后，其实这个Dialog只是简单的返回了一个DialogResult.OK,在调用Dialog.Connection属性时会尝试连接数据源，如果你提供的连接选项有问题，那就要报异常了，因此包在一个try...catch中了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2321712.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2012/01/13/2321712.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/12/11/2283874.html</id><title type="text">iPhone上的UIPopoverController</title><summary type="text">好久没有更新博客了，也不知道每天在忙什么，好像挺忙的，但是一点有系统有东西似乎都没有搞出来，今天闲来无事，算是发一个口水帖。最近一段时间以来因为工作上的需要，开始学习Object-C了，当然，主要的方向是iOS，通过一段学习，算是掌握了些皮毛吧。本来非常担心内存管理的问题，但经过一番了解后，发现原来这并不是一件非常困难的事，更没有想到的是XCode 4.2.1中，居然有了自动引用记数(ARC)这么个东西，一下子让事情变的简单了，虽然在iPhone没有垃圾回收机制，但是编译器自动帮你写了那些诸如dealloc，release,autorelease之类的语句了，这对于习惯了C#语法的人来说，不啻</summary><published>2011-12-11T05:01:00Z</published><updated>2011-12-11T05:01:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/12/11/2283874.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/12/11/2283874.html"/><content type="html">&lt;p&gt;好久没有更新博客了，也不知道每天在忙什么，好像挺忙的，但是一点有系统有东西似乎都没有搞出来，今天闲来无事，算是发一个口水帖。最近一段时间以来因为工作上的需要，开始学习Object-C了，当然，主要的方向是iOS，通过一段学习，算是掌握了些皮毛吧。本来非常担心内存管理的问题，但经过一番了解后，发现原来这并不是一件非常困难的事，更没有想到的是XCode 4.2.1中，居然有了自动引用记数(ARC)这么个东西，一下子让事情变的简单了，虽然在iPhone没有垃圾回收机制，但是编译器自动帮你写了那些诸如dealloc，release,autorelease之类的语句了，这对于习惯了C#语法的人来说，不啻为一个福音啊。总的说来，Cocoa Touch中类型的命名还是让人感觉舒服，Object-C的方法签名模式也相当不错，以前使用其他语言时老是感觉文不达意，使用Object-C定义方法时就不会有这种尴尬了。基于我的了解，我发现C#程序员去学Object-C应该不算一件很难的事。&lt;/p&gt;&#xD;
&lt;p&gt;在iPhone开发时，在UINavigationController或UITabBarController上因BarButtonItem太多而位置不够用时，多会选择使用UIActionSheet，但UIActionSheet的显示区域较大，而且UIActionSheet和UIAlertView一样，都是iOS SDK中自带的类型，想要对其样式做些个性化的处理就稍麻烦了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011121112393354.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;UIActionSheet样式&lt;/p&gt;&#xD;
&lt;p&gt;在我现在的项目中，也有类似的需求，要在点击一个BarButtonItem后显示更多的操作，有点类似UC浏览器工具栏最中间的那个按钮(&amp;ldquo;更多&amp;rdquo;)点击后的效果&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011121112374086.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;UC浏览器的Popover样式&lt;/p&gt;&#xD;
&lt;p&gt;貌似在Apple建议中，不推荐使用Popover样式，因为iPhone屏幕本来就不大，如果放太多东西了不好，但是UIActionSheet个人感觉实在是看起来不咋的，还是想使用Popover样式，但是又不知道该怎么实现，经过一番好找，在Apple官方的示例中找到一个例程(&lt;a href="http://developer.apple.com/library/ios/samplecode/ToolbarSearch/ToolbarSearch.zip"&gt;ToolbarSearch&lt;/a&gt;),其中使用UIPopoverController类，实现了这个功能，结果激动劲还没有过，发现一个非常悲惨的现实，这个类型只能使用于iPad，而不能使用于iPhone上！！！原因还是基于Apple认为应该在iPhone上使用UIActionSheet!&lt;/p&gt;&#xD;
&lt;p&gt;我觉得肯定有方法能使用在iPhone上(现成的代码，而不是自已去实现一个)，经过又一番好找，终于发现了了WEPopover，一个相当不错的包，项目地址：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://github.com/werner77/WEPopover"&gt;https://github.com/werner77/WEPopover&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在，剩下最后一个问题了，在启用了ARC的环境下如何使用WEPopover,很快，找到了几个ARC的实现：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://github.com/pmilanez/WEPopover"&gt;https://github.com/pmilanez/WEPopover&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://github.com/dhoerl/WEPopover"&gt;https://github.com/dhoerl/WEPopover&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://github.com/darknoon/WEPopover/tree/feature/arc"&gt;https://github.com/darknoon/WEPopover/tree/feature/arc&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;WEPopover效果图&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011121112554437.jpg" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2283874.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/12/11/2283874.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/10/14/2212534.html</id><title type="text">青山在，人未老</title><summary type="text">每年春节晚会接近尾声时，总会唱响《难忘今宵》这首歌曲，每每这个时刻，我总有些许的期待，但更多的是浓浓的忧伤。我也不清楚在忧伤什么，是逝去的亲人，渐疏的友情，抑或是湮灭的韶华？我很难说清楚，隐约间似乎听到从内心传来的细微声音：“不要这么快，不要这么快”... 到了分手的时间，才体会到什么是相见时难别亦难，有时候真的很羡慕金鱼，因为据说金鱼的记忆只有三秒钟，这样就可以彼此忘记，了无牵挂。“相濡以沫，不如相忘于江湖”这句话原是很有道理的。 我的内心挣扎着想要留下来，但是我又有太多的理由要走，非常非常纠结，其程度不亚于我人生中每一次重大抉择。一直以来，我尽力想做一个有情有义的人，But … OK，..</summary><published>2011-10-14T11:45:00Z</published><updated>2011-10-14T11:45:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/10/14/2212534.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/10/14/2212534.html"/><content type="html">&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;每年春节晚会接近尾声时，总会唱响《难忘今宵》这首歌曲，每每这个时刻，我总有些许的期待，但更多的是浓浓的忧伤。我也不清楚在忧伤什么，是逝去的亲人，渐疏的友情，抑或是湮灭的韶华？我很难说清楚，隐约间似乎听到从内心传来的细微声音：&amp;ldquo;不要这么快，不要这么快&amp;rdquo;...&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
到了分手的时间，才体会到什么是相见时难别亦难，有时候真的很羡慕金鱼，因为据说金鱼的记忆只有三秒钟，这样就可以彼此忘记，了无牵挂。&amp;ldquo;相濡以沫，不如相忘于江湖&amp;rdquo;这句话原是很有道理的。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;!--?xml:namespace prefix = o ns = &#xD;
"urn:schemas-microsoft-com:office:office" /--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
我的内心挣扎着想要留下来，但是我又有太多的理由要走，非常非常纠结，其程度不亚于我人生中每一次重大抉择。一直以来，我尽力想做一个有情有义的人，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;But &amp;hellip; OK&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，我承认，在很多的情况下还是选择了自已那点卑微的私念。我知道，这次出走真可谓负明软良多。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp; &#xD;
&amp;nbsp;在这将要分别的日子，我首先要感谢&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Cathy&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Cathy&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;缔造了明软，才使我们大家有机会在这里相聚，有机会在这里学习，发展并获得生活所必需的资源；其次，我要感谢&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Ed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，如果不是&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Ed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;垂顾，我也许还在富士康里面继续在适应它的企业文化，同时&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Ed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;给予了我开阔的架构思想；再次，我要感谢俊彧，俊彧给了我充分的信任和空间，使我那点小小的力量有了发挥的舞台；最后，我要感谢明软的每一个人，谢谢你们慷慨，你们给予我的每一点一滴的支持和帮助，我都将铭记于心，也正是有了你们每一分子，才有一个完整的明软，才有我的明软历程。同时，我也愧对这些给予我很多机会和帮助的人，对于&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Cathy&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，我食君之禄，却未能为君分忧；对于&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Ed&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;，我没有报答知遇之恩；尤其对于俊彧、树立、郑飞，我几乎是在他们最需要我的时候离开了他们；还有所有留在明软的兄弟姐妹，不能跟随你们在这险恶的环境中一起战斗，我内心非常非常愧疚。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
在这临别之际，对于留在明软继续战斗的兄弟姐妹，我向你们送上我的祝福，并附上我一点点个人对于工作，学习的体会，以供参考：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;工作：这个世界没有无缘无故的爱，为爱工作而爱工作这个命题不成立，但是为了兴趣，为了待遇，为了理想爱工作，就很正常了。正如你向你心爱的人示爱一样。只有你付出了，才会有收获。很多时候，员工总是认为公司的挣不挣钱是老板的事，和自已关系不大；或者就是认为我自已拿这点钱，做这点事就算对得起老板了，对于大型企业也许个别员工这么想想倒关系不大，但是对于软件行业，尤其是软件行业中的中小企业，一个人的这种想法，有可能会害死公司，也会伤害其他积极努力的同事，最终害了自已。产生了这种想法的人永远不会受到老板的器重以及同事们的尊重。有此想法趁早找个工厂当&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;IT&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;养老吧。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;学习：必须知道学习是在为谁在学，在经理？老板？还是自已，甚至延伸到父母妻儿？劝学的文章很多，我就不在这里献丑了，一句话，谁学谁知道。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
年年都唱《难忘今宵》，年年的演唱又不尽相同，尽管每年的《难忘今宵》让我伤感，伤感时光飞转，岁月流逝，但来年的《难忘今宵》都如约等在那里，没有因个人的好恶停驻或者爽约，如同明软时而送走一位老同事，时而迎来一位新同事一样，没有人能知道在下一刻时间，送走的是谁，迎来的又是谁，每思及此，令人扼腕怅然。人的一生中会历经很多个抉择，某个地方，也许会成为终生的归宿，而更多的地方，很遗憾的作为了暂泊的驿站，今日看来明软之于我，许是个驿站，我之于明软，许是个过客，偏又这个驿站留给我的痕迹太多，太深，太匆匆&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&amp;hellip;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;很多年以前，我的主管对于我的离去说：&amp;ldquo;打工么，就是这样人来人往，想开些&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&amp;hellip;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;rdquo;，只是可惜，我至今仍没有看开。然而正因为有了分别，才有了重逢，人道：山不转水转，人又道：青山不改，绿水长流，难料将来不会与诸位中的某些人出现此间别后，山水再相逢的情形，待到那时，把酒言欢，欣喜至哉。无论《难忘今宵》如何让人唏嘘不已，但所幸最后几句，还是让人欣慰的：&amp;ldquo;告别今宵，不论新友与故交，明年春来再相邀，青山在人未老&amp;rdquo;，有鉴于斯，我觉得自已倒不必太过伤怀，毕竟，我们青山还在，人仍未老。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
祝愿明软的明天会更好&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span lang="EN-US"&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#xD;
&lt;/span&gt;于2011-10-14&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt;" &gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2212534.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/10/14/2212534.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/09/28/2193990.html</id><title type="text">[原]jQuery ListBox Plugin(ListBox插件)</title><summary type="text">转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)。未经作者同意，请勿擅自修改本文内容。这两天项目中要用到类似于ListBox的功能了，本以为有很多jQuery插件，没有想到的是，居然没有搜到好用的，咋办呢，自已动手丰衣足食吧，于是花了一个晚上的时间做出来一个，上效果图：该ListBox插件支持拖放，多选。应用说明:HTML:&amp;lt;ul id=&amp;quot;left&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;Javascript: $(&amp;#39;#left&amp;#39;).listbox({ data: &amp;#39;/Data/Index?&amp;#39;</summary><published>2011-09-28T09:26:00Z</published><updated>2011-09-28T09:26:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/09/28/2193990.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/09/28/2193990.html"/><content type="html">&lt;p&gt;转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)。未经作者同意，请勿擅自修改本文内容。&lt;/p&gt;&#xD;
&lt;p&gt;这两天项目中要用到类似于ListBox的功能了，本以为有很多jQuery插件，没有想到的是，居然没有搜到好用的，咋办呢，自已动手丰衣足食吧，于是花了一个晚上的时间做出来一个，上效果图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011092815113639.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;该ListBox插件支持拖放，多选。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;应用说明:&lt;/p&gt;&#xD;
&lt;p&gt;HTML:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;ul id="left"&amp;gt;&amp;lt;/ul&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;Javascript:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#left').listbox({&#xD;
                data: '/Data/Index?' + new Date().getTime(),&#xD;
                width: 200,&#xD;
                height: 300&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;默认选项说明:&lt;/p&gt;&#xD;
&lt;p&gt;Options:&lt;/p&gt;&#xD;
&lt;p&gt;dnd: 是否支持拖放，默认false&lt;/p&gt;&#xD;
&lt;p&gt;dndscope: 支持拖放时相关的作用域，举例来说，即，A ListBox和B ListBox的dndscope相同，则这两个ListBox中的元素是可以相互拖放的&lt;/p&gt;&#xD;
&lt;p&gt;height: 地球人都知道，默认'auto'&lt;/p&gt;&#xD;
&lt;p&gt;width: 火星人也知道了，默认'auto'&lt;/p&gt;&#xD;
&lt;p&gt;data: 数据源，即可以是url也可以是对象数组，默认为[]；&lt;/p&gt;&#xD;
&lt;p&gt;无论是远程还是本地数据均有两种格式：&lt;/p&gt;&#xD;
&lt;p&gt;1. {value: '', text: ''}&lt;/p&gt;&#xD;
&lt;p&gt;2. ['', '']，在这种情况下，请将value置于第一个元素&lt;/p&gt;&#xD;
&lt;p&gt;multiselect: 是否允许多选，默认false&lt;/p&gt;&#xD;
&lt;p&gt;ajaxsettings: 如果需要从远程获取数据，这里定义了$.ajax的默认选项&lt;/p&gt;&#xD;
&lt;p&gt;默认:&lt;/p&gt;&#xD;
&lt;p&gt;type: 'GET'&lt;/p&gt;&#xD;
&lt;p&gt;dataType: 'json'&lt;/p&gt;&#xD;
&lt;p&gt;success: funtion(data){}&lt;/p&gt;&#xD;
&lt;p&gt;Events:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;2011.9.30 1.1版删除&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: line-through;"&gt;itemselected: ListBox中的元素选中的被触发；&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: line-through;"&gt;定义：function(data){}，参数data为选中的元素数组&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;2011.9.30 1.1版新增&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;selectchange: ListBox中的元素选中项发生变化时被触发；&lt;/p&gt;&#xD;
&lt;p&gt;定义：function(data){}，参数data为选中的元素数组&lt;/p&gt;&#xD;
&lt;p&gt;Methods:&lt;/p&gt;&#xD;
&lt;p&gt;addItem: 添加一个元素；&lt;/p&gt;&#xD;
&lt;p&gt;定义：function(data){}，其中data类型为{value: '', text: ''}或['', '']&lt;/p&gt;&#xD;
&lt;p&gt;示例：　　　　&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnAddItem').click(function () {&#xD;
                $('#left').listbox().addItem({ value: 3, text: 'c' });&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;addRange: 添加元素数组;&lt;/p&gt;&#xD;
&lt;p&gt;定义：function(data){}，其中data类型为由{value: '', text: ''}或['', '']组成的数组&lt;/p&gt;&#xD;
&lt;p&gt;示例:　　&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnAddRange').click(function () {&#xD;
                $('#left').listbox().addRange([{ value: 4, text: 'd' }, ['5', 'e']]);&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;clear: 清除所有元素&lt;/p&gt;&#xD;
&lt;p&gt;定义: function(){}&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnClear').click(function () {&#xD;
                $('#left').listbox().clear();&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;getData: 获取与指定jQuery对象关联的数据&lt;/p&gt;&#xD;
&lt;p&gt;定义:function(a){},参数a为ListBox元素的a标签，ListBox元素的DOM结构为&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnGetData').click(function () {&#xD;
                var a = $('#left a:first');&#xD;
                if (a.size() &amp;gt; 0) {&#xD;
                    var data = $('#left').listbox().getData(a);&#xD;
                    alert("{value: '" + data.value + "', text: '" + data.text + "'}");&#xD;
                }&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;getDatas: 获取所有数据&lt;/p&gt;&#xD;
&lt;p&gt;定义: function(){}&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnGetDatas').click(function () {&#xD;
                alert($('#left').listbox().getDatas().length);&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;getSelected: 获取所有选中的数据&lt;/p&gt;&#xD;
&lt;p&gt;定义:function(){}&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnGetSelected').click(function () {&#xD;
                alert($('#left').listbox().getSelected().length);&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;　　2011.9.30 1.1版新增&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;reload: 重新加载ListBox中的数据&lt;/p&gt;&#xD;
&lt;p&gt;定义:function(data,ajaxsettings){}，参数data，ajaxsettins定义同Options中同名属性data的定义&lt;/p&gt;&#xD;
&lt;p&gt;示例:　　　　&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnReload').click(function () {&#xD;
                $('#left').listbox().reload({ data: '/Data/Index', ajaxsettings: {&#xD;
                    data: { id: 'a' }&#xD;
                }&#xD;
                });&#xD;
            });&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;removeItem: 删除指定value值的元素&lt;/p&gt;&#xD;
&lt;p&gt;定义:function(data){}，参数data可以为单个值，也可以为{value:''}对象&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnRemoveItem').click(function () {&#xD;
                $('#left').listbox().removeItem({ value: 1 });&#xD;
            });&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;removeRange: 删除指定value值数组的元素&lt;/p&gt;&#xD;
&lt;p&gt;定义:function(data){}，参数data为单个值，或{value:''}对象的数组&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnRemoveRange').click(function () {&#xD;
                var datas = $('#left').listbox().getDatas();&#xD;
                $('#left').listbox().removeRange(datas);&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;setSelection: 选中指定value值的元素&lt;/p&gt;&#xD;
&lt;p&gt;定义: function(value){}，参数value为单个值&lt;/p&gt;&#xD;
&lt;p&gt;示例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnSetSelection').click(function () {&#xD;
                $('#left').listbox().setSelection(1);&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;调用方法时，可以也可以使用$('#selector').listbox('methodName',arguments)方式，例:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;$('#btnCallMethod').click(function () {&#xD;
                var a = $('#left a:first');&#xD;
                if (a.size() &amp;gt; 0) {&#xD;
                    var data = $('#left').listbox('getData', a);&#xD;
                    alert("{value: '" + data.value + "', text: '" + data.text + "'}");&#xD;
                }&#xD;
            });&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK,至此我的需求基本满足了，就先这样吧，欢迎在试用过程中提交bug或者改进建议，谢了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/think8848/CleverListBox.rar"&gt;源代码与示例下载&lt;/a&gt;(VS2010 ASP.NET MVC 3)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2193990.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/09/28/2193990.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/09/18/2180539.html</id><title type="text">[原]SubSonic在同一个表连内实现接查询(JOIN)</title><summary type="text">转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)使用SqlCommand的感觉有时侯很爽，就跟那啥一样，对于数据的控制酣畅淋漓，但在这程中总是很担心一不小心打个颤，出现严重后果。之前在选择ORM时，选择了SubSonic，不觉已用了n年了，总的感觉来说还是非常不错的，但是SubSonic一直有一个硬伤：不能对同一个表进行JOIN连接。这个需求虽说不是天天有，但一个月总有那么几天需要去面对，搞的那几天人心情都不爽，当初选SubSonic是我力主的，解决不了问题，我难免得挨几下白眼。今天点低，又遇到了，需求很简单：一个Users中有ID,Nam</summary><published>2011-09-18T10:03:00Z</published><updated>2011-09-18T10:03:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/09/18/2180539.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/09/18/2180539.html"/><content type="html">&lt;p&gt;转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)&lt;/p&gt;&#xD;
&lt;p&gt;使用SqlCommand的感觉有时侯很爽，就跟那啥一样，对于数据的控制酣畅淋漓，但在这程中总是很担心一不小心打个颤，出现严重后果。之前在选择ORM时，选择了SubSonic，不觉已用了n年了，总的感觉来说还是非常不错的，但是SubSonic一直有一个硬伤：不能对同一个表进行JOIN连接。这个需求虽说不是天天有，但一个月总有那么几天需要去面对，搞的那几天人心情都不爽，当初选SubSonic是我力主的，解决不了问题，我难免得挨几下白眼。今天点低，又遇到了，需求很简单：一个Users中有ID,Name,SupervisorID三个列，SupervisorID为这个User的主管，很明显，这个查询很简单：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;SELECT [Users].[ID],[Users].[Name],[Supervisors].[Name] AS [SupervisorName] FROM Users LEFT JOIN [Users] AS [Supervisors] ON [Users].[SupervisorID] = [Supervisors].[ID]&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然而在SubSonic里不太简单了，最自然的写法为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;var query = new Select(/*Columns*/).From&amp;lt;User&amp;gt;()&#xD;
        .LeftOuterJoin&amp;lt;User&amp;gt;("SupervisorID","ID");&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;SubSonic生成的SQL为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;SELECT [Users].[ID], [Users].[Name], [Users].[SupervisorID] FROM  INNER JOIN [Users] ON [Users].[SupervisorID] = [Users].[ID]&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;两个很离奇的结果，一个是在FROM后面居然没有表名，另一个是使用LeftOuterJoin方法，生成的居然是INNER JOIN?&lt;/p&gt;&#xD;
&lt;p&gt;于是使用LeftOuterJoin的另一个重载形式：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;var provider = ProviderFactory.GetProvider();&#xD;
var tbUsers = provider.FindOrCreateTable&amp;lt;User&amp;gt;();&#xD;
var tbSupervisors = provider.FindOrCreateTable&amp;lt;User&amp;gt;();&#xD;
var colSupervisorID = tbUsers.GetColumn("SupervisorID");&#xD;
var colID = tbSupervisors.GetColumn("ID");&#xD;
&#xD;
var query = new Select(/*Columns*/).From(tbUsers).LeftOuterJoin(colSupervisorID,colID);&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这时SubSonic生成的SQL为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;SELECT [Users].[ID], [Users].[Name], [Users].[SupervisorID] FROM  LEFT OUTER JOIN [Users] ON [Users].[SupervisorID] = [Users].[ID]&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这次是LEFT OUTER JOIN了，但是FROM后面的表名还是没有，于是先查查在生成FROM时到底发生了什么　　&lt;/p&gt;&#xD;
&lt;p&gt;SubSonic.SqlGeneration.ANSISqlGenerator.cs&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public virtual string GenerateFromList()&#xD;
		{&#xD;
			StringBuilder sb = new StringBuilder();&#xD;
			sb.AppendLine();&#xD;
			sb.Append(this.sqlFragment.FROM);&#xD;
&#xD;
			bool isFirst = true;&#xD;
			foreach (ITable tbl in query.FromTables)&#xD;
			{&#xD;
				// EK: The line below is intentional. See: http://weblogs.asp.net/fbouma/archive/2009/06/25/linq-beware-of-the-access-to-modified-closure-demon.aspx&#xD;
				ITable table = tbl;&#xD;
&#xD;
				//Can't pop a table into the FROM list if it's also in a JOIN&#xD;
				if (!query.Joins.Any(x =&amp;gt; x.FromColumn.Table.Name.Equals(table.Name, StringComparison.InvariantCultureIgnoreCase)))&#xD;
				{&#xD;
					if (!isFirst)&#xD;
						sb.Append(", ");&#xD;
					sb.Append(tbl.QualifiedName);&#xD;
					isFirst = false;&#xD;
				}&#xD;
			}&#xD;
			return sb.ToString();&#xD;
		}&amp;nbsp;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;原来它做了验证，如果FROM的表存在于将要JOIN的表中，则成生一个空字符串...　　&lt;/p&gt;&#xD;
&lt;p&gt;这样看来，SubSonic还真是没有提供这个功能了，现在的问题是，在SubSonic中添加这个功能的代价有多大呢，如果能轻量级(我喜欢轻量级)的解决这个问题还是值的动下手的。&lt;/p&gt;&#xD;
&lt;p&gt;先看看JOIN到底是怎么生成的：&lt;/p&gt;&#xD;
&lt;p&gt;SubSonic.SqlGeneration.ANSISqlGenerator.cs&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public virtual string GenerateJoins()&#xD;
		{&#xD;
			StringBuilder sb = new StringBuilder();&#xD;
&#xD;
			if (query.Joins.Count &amp;gt; 0)&#xD;
			{&#xD;
				sb.AppendLine();&#xD;
				//build up the joins&#xD;
				foreach (Join j in query.Joins)&#xD;
				{&#xD;
					string joinType = Join.GetJoinTypeValue(this, j.Type);&#xD;
					string equality = " = ";&#xD;
					if (j.Type == Join.JoinType.NotEqual)&#xD;
						equality = " &amp;lt;&amp;gt; ";&#xD;
&#xD;
					sb.Append(joinType);&#xD;
					sb.Append(j.FromColumn.Table.QualifiedName);&#xD;
					if (j.Type != Join.JoinType.Cross)&#xD;
					{&#xD;
						sb.Append(" ON ");&#xD;
						sb.Append(j.ToColumn.QualifiedName);&#xD;
						sb.Append(equality);&#xD;
						sb.Append(j.FromColumn.QualifiedName);&#xD;
					}&#xD;
				}&#xD;
			}&#xD;
			return sb.ToString();&#xD;
		}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;其中需要关注的是sb.Append(j.FromColumn.Table.QualifiedName);这句，SubSonic使用ITable的QualifiedName来生成JOIN后面的表名的，QualifiedName属性定义如下：&lt;/p&gt;&#xD;
&lt;p&gt;SubSonic.Schema.DatabaseTable.cs&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public string QualifiedName&#xD;
        {&#xD;
            get { return Provider.QualifyTableName(this); }&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;SubSonic在需要表名的地方均使用了QualifiedName，在这种情况下，去修改QualifyTableName的值本身也不明智，而且这个有点&amp;ldquo;可恶&amp;rdquo;的是，定义个只读属性也就算了，居然值还是个方法的返回值，这种方式即使用反射也没有办法修改其值了，因此也就打消了在该属性动手脚的想法。到底该怎么办呢，手动添加一个Join吧，Join的实际上是一个IColumn，而IColumn的背后还站着一个ITable，看起来归根到底是需要生成一个ITable，而且这个ITable的名字不能和数据库中的表名相同(不然又被FROM给挡住了)，最悲摧的是真实的表名还必须出现在SQL语句(有点废话)...&lt;/p&gt;&#xD;
&lt;p&gt;鉴于QualifiedName出现在多个地方，因此就使用QualifiedName作为别名吧，那么在sb.Append(j.FromColumn.Table.QualifiedName);这一行，QualifiedName肯定得换成诸如[XXX] AS QualifiedName之类的，只要动一行，就可以了。经过一番查看，发现DatabaseTable中的FriendlyName没有啥用，除了定义外没有发现任何地方有什么用，于是想出来一段代码：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public static SqlQuery SameTableJoin(this SqlQuery query, IColumn fromColumn, string toTableQualifiedName, Join.JoinType type, string toColumnName = "ID")&#xD;
        {&#xD;
            var provider = fromColumn.Provider;&#xD;
&#xD;
            var tmpTable = new DatabaseTable(toTableQualifiedName, provider);&#xD;
            tmpTable.FriendlyName = fromColumn.Table.Name;&#xD;
            var tmpCol = new DatabaseColumn(toColumnName, tmpTable);&#xD;
&#xD;
            query.Joins.Add(new Join(tmpCol, fromColumn, type));&#xD;
&#xD;
            if (!query.FromTables.Contains(tmpCol.Table))&#xD;
            {&#xD;
                query.FromTables.Add(tmpCol.Table);&#xD;
            }&#xD;
&#xD;
            return query;&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;FriendlyName是指定了，但是SubSonic并不知道我们用了这个属性啊，没办法，只有重载GenerateJoins方法了，在它里面使用FriendlyName，要达到非侵入目的，定义一个SqlServerProvider的派生类吧;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class CleverSqlServerProvider : SqlServerProvider&#xD;
    {&#xD;
        public CleverSqlServerProvider(string connectionString, string providerName)&#xD;
            : base(connectionString, providerName)&#xD;
        { }&#xD;
&#xD;
        public override ISqlGenerator GetSqlGenerator(SqlQuery query)&#xD;
        {&#xD;
            return new CleverSqlGenerator(query);&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这个类其实还是没有做具体的SQL代码生成工作，还得定义一个SqlGenerator类:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class CleverSqlGenerator : Sql2005Generator&#xD;
    {&#xD;
        public CleverSqlGenerator(SqlQuery query)&#xD;
            : base(query)&#xD;
        {&#xD;
            ClientName = "System.Data.SqlClient";&#xD;
        }&#xD;
        public override string GenerateJoins()&#xD;
        {&#xD;
            StringBuilder sb = new StringBuilder();&#xD;
&#xD;
            if (base.Query.Joins.Count &amp;gt; 0)&#xD;
            {&#xD;
                sb.AppendLine();&#xD;
                //build up the joins&#xD;
                foreach (Join j in base.Query.Joins)&#xD;
                {&#xD;
                    string joinType = Join.GetJoinTypeValue(this, j.Type);&#xD;
                    string equality = " = ";&#xD;
                    if (j.Type == Join.JoinType.NotEqual)&#xD;
                        equality = " &amp;lt;&amp;gt; ";&#xD;
&#xD;
                    sb.Append(joinType);&#xD;
                    sb.Append(string.IsNullOrEmpty(j.FromColumn.Table.FriendlyName) ? j.FromColumn.Table.QualifiedName : string.Format("[{0}] AS {1}", j.FromColumn.Table.FriendlyName, j.FromColumn.Table.QualifiedName));&#xD;
                    if (j.Type != Join.JoinType.Cross)&#xD;
                    {&#xD;
                        sb.Append(" ON ");&#xD;
                        sb.Append(j.ToColumn.QualifiedName);&#xD;
                        sb.Append(equality);&#xD;
                        sb.Append(j.FromColumn.QualifiedName);&#xD;
                    }&#xD;
                }&#xD;
            }&#xD;
&#xD;
            return sb.ToString();&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;使用sb.Append(string.IsNullOrEmpty(j.FromColumn.Table.FriendlyName) ? j.FromColumn.Table.QualifiedName : string.Format("[{0}] AS {1}", j.FromColumn.Table.FriendlyName, j.FromColumn.Table.QualifiedName));一行，将FriendlyName应用了进去，现在唯一的问题是：如何使用CleverSqlServerProvider了，new一个吗？no no no，这个想都不要想，这是我不能容忍的，那种使用配置文件？好像还真没有发现该怎么配，再看看ProviderFactory类，发现一个有用的方法：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public static void Register(string providerName, Func&amp;lt;string, string, IDataProvider&amp;gt; factoryMethod)&#xD;
        {&#xD;
            if (_factories.ContainsKey(providerName))&#xD;
            {&#xD;
                _factories.Remove(providerName);&#xD;
            }&#xD;
&#xD;
            _factories.Add(providerName, factoryMethod);&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这下有救了吧:)&lt;/p&gt;&#xD;
&lt;p&gt;使用SameTableJoin方法试试，看能不能生成想要的结果;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;var provider = ProviderFactory.GetProvider();&#xD;
            var tbUser = provider.FindOrCreateTable&amp;lt;User&amp;gt;();&#xD;
            var colSupervisorID = tbUser.GetColumn("SupervisorID");&#xD;
&#xD;
            var query = new Select(/*Columns*/).From&amp;lt;User&amp;gt;()&#xD;
                .SameTableJoin(colSupervisorID, "Supervisors", Join.JoinType.LeftOuter);&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;看看生成的SQL:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;SELECT [Users].[ID], [Users].[Name], [Supervisors].[Name] AS [SupervisorName] FROM [Users] LEFT OUTER JOIN [Users] AS [Supervisors] ON [Users].[SupervisorID] = [Supervisors].[ID]&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK,终于达到效果了，没有修改SubSonic的源码，但是达到了预期的目的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;写在后面的一句话，个人感觉，千万不要因为SubSonic这点瑕疵看不起它，总的来说，几年用下来还是觉得非常爽的，而且你也看到了，有了问题也很容易自已动手修补，我已经攒了不少这种扩展方法增强SubSonic的功能了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2180539.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/09/18/2180539.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html</id><title type="text">[原]ASP.NET MVC 3 Razor 表单还能再直观点</title><summary type="text">转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)依照本人惯例，开篇先说些与主题无关的话：本来打算把写博客的这个习惯坚持下去，就算不能出精品，也能出一些水货，对于某些小问题提供点解决方案，但是今年的8月真可谓是多事之“秋”，很多事情都凑到一起去了，几乎没有时间学习新的东西，更别说去写博客了，9月眼看要过去一半了，昨天才憋出一个小东西，觉得还稍能滥竽充数下。打算用ASP.NET MVC实现公司的某产品了，昨天遇到一个问题：在异常发生时转回提交前的页面后，原来输入的内容不见了，这可是个大问题，记得以前我在写《ASP.NET MVC异常处理方案》一</summary><published>2011-09-14T05:22:00Z</published><updated>2011-09-14T05:22:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html"/><content type="html">&lt;p&gt;转载请注明作者(think8848)和出处(http://think8848.cnblogs.com)&lt;/p&gt;&#xD;
&lt;p&gt;依照本人惯例，开篇先说些与主题无关的话：本来打算把写博客的这个习惯坚持下去，就算不能出精品，也能出一些水货，对于某些小问题提供点解决方案，但是今年的8月真可谓是多事之&amp;ldquo;秋&amp;rdquo;，很多事情都凑到一起去了，几乎没有时间学习新的东西，更别说去写博客了，9月眼看要过去一半了，昨天才憋出一个小东西，觉得还稍能滥竽充数下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打算用ASP.NET MVC实现公司的某产品了，昨天遇到一个问题：在异常发生时转回提交前的页面后，原来输入的内容不见了，这可是个大问题，记得以前我在写《&lt;a href="http://www.cnblogs.com/think8848/archive/2011/03/18/1987849.html" target="_blank"&gt;ASP.NET MVC异常处理方案&lt;/a&gt;》一文时已经解决了这个问题，怎么又看不见提交前的输入了呢，把以前的代码打开后发现了问题所在：&lt;/p&gt;&#xD;
&lt;p&gt;在当前的代码中表单的代码为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;input id="txtName" name="Name" type="text" /&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;而之前能出现效果的表单代码为：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;@Html.TextBoxFor(x =&amp;gt; x.Name)&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;稍经测试，就发现，使用Html的扩展方法生成的&amp;lt;input&amp;gt;标签可以获得提交之前的值，但是自已手写的则不行，所以这个TextBox扩展方法中肯定有某种机制，能自动将值填进&amp;lt;input&amp;gt;标签中。一开始和同事讨论后觉得，使用@Html.TextBoxFor方法有一个好处，那就是如果更换了Name属性的名称，VS可以自动重构代码，使*.cshtml代码的x.Name自动更新至新的属性名，经测试后发现原来不是想的这么回事，修改了Name属性的名称，如:PName，使用VS重构代码，发现在视图中属性名居然没有改过来；而且如果使用Html的扩展方法，似乎也有一些问题，最重要一点就是不直观，在目前的Razor引擎中还不太明显，反正也没有设计器，但是如果以后有了Razor引擎有了设计器功能，基本可以断定的是，使用@Html.TextBoxFor()的方式很难能做到所见即所得的效果，而且在一个cshtml页面中，即时不能使用设计器，看代码时如果视图上使用@Html.XXX也不是很直观，既然使用Html扩展方法的方式即不能有利于重构代码，又不直观，那么使用Html标签的理由似乎就变的充分多了，如果使用这种方法，即使不会C#的人也可以写出来页面。&lt;/p&gt;&#xD;
&lt;p&gt;在这种想法的驱动下，想出一个办法：自已实现一个填充标签值的扩展方法。于是打开ASP.NET MVC 3源代码，看看在这个TextBox内部到底在做些什么，为什么它可以把模型(ViewData.Model)中的值，以及ViewData.ModelState中的值填充到标签中，一步一步查下来，发现原来实现方法比较简单，直接上代码：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public static class HtmlValueExtension&#xD;
    {&#xD;
        public static MvcHtmlString Value&amp;lt;TModel, TProperty&amp;gt;(this HtmlHelper&amp;lt;TModel&amp;gt; html, Expression&amp;lt;Func&amp;lt;TModel, TProperty&amp;gt;&amp;gt; expression)&#xD;
        {&#xD;
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);&#xD;
&#xD;
            return Value(html, metadata.PropertyName);&#xD;
        }&#xD;
&#xD;
        public static MvcHtmlString Value(this HtmlHelper html, string name)&#xD;
        {&#xD;
            string attemptedValue = null;&#xD;
            ModelState modelState;&#xD;
&#xD;
            if (html.ViewData.ModelState.TryGetValue(name, out modelState))&#xD;
            {&#xD;
                if (modelState.Value != null)&#xD;
                {&#xD;
                    attemptedValue = modelState.Value.ConvertTo(typeof(string), null /* culture */).ToString();&#xD;
                }&#xD;
            }&#xD;
&#xD;
            return new MvcHtmlString(attemptedValue ?? Convert.ToString(html.ViewData.Eval(name), CultureInfo.CurrentCulture));&#xD;
        }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;定义一个HtmlHelper&amp;lt;TModel&amp;gt;的扩展方法Value&amp;lt;TModel,TProperty&amp;gt;，然后根据Lambda表达式获取到指定属性的元数据，优先考虑从ModelState中拿出对应的数据，也就是提交前页面表单数据，如果这个数据为null,则尝试ViewData.Model中指定的数据，很简单吧:)&lt;/p&gt;&#xD;
&lt;p&gt;有了这个类，在页面上使用如下代码调用：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;input id="txtDeptName" name="Name" type="text" value="@Html.Value(x =&amp;gt; x.Name)"/&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样，就可以达到与@Html.TextBox()一样的效果了，但是从视图的代码角度来说，直观了不少，而且如果以后Razor引擎有了设计器，估计也可以不用调试也能看到页面效果了。　　&lt;/p&gt;&#xD;
&lt;p&gt;最后再友情提示下，如果您在一个Razor的视图中定义了一个表单标签，这个表单标签的值并不对应Model的某个属性，这时如果您想获取提交前的值话，使用Request.Params["TagName"]即可。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2175432.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/09/14/2175432.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/07/24/2115295.html</id><title type="text">HTTP could not register URL http://+:8000/testservice/. Your process does not have access rights to this namespace 解决方案</title><summary type="text">今天继续调试WCF Web API源代码，方向是跟踪其单元测试，结果一上手就出了一个错误：HTTP could not register URL http://+:8000/testservice/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).经过一番好找，才知道是由于在Vista和Win7中的安全设置引起的，使用&amp;quot;netsh.exe&amp;quot;命令可以将http://+:8000/t</summary><published>2011-07-24T03:33:00Z</published><updated>2011-07-24T03:33:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/07/24/2115295.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/07/24/2115295.html"/><content type="html">&lt;p&gt;今天继续调试WCF Web API源代码，方向是跟踪其单元测试，结果一上手就出了一个错误：&lt;/p&gt;&#xD;
&lt;p&gt;HTTP could not register URL http://+:8000/testservice/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011072411253393.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经过一番好找，才知道是由于在Vista和Win7中的安全设置引起的，使用"&lt;span  style="color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;strong&gt;netsh.exe&lt;/strong&gt;&lt;/span&gt;"命令可以将http://+:8000/testservice添加到安全设置中，方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="font-size: 12px; line-height: 18px; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;"&gt;netsh http add urlacl url=&lt;a href="http://+:8000/" mce_href="http://+:8000/" style="color: #0066dd; cursor: pointer; text-decoration: none; font-weight: normal; outline-style: none; outline-width: initial; outline-color: initial;"&gt;&lt;span style="color: blue; text-decoration: underline;"&gt;http://+:8000/&lt;/span&gt;&lt;/a&gt;&amp;nbsp;user=DOMAIN\UserName&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="font-size: 12px; line-height: 18px; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;"&gt;但看到这里，我是不想使用Dos命令，感觉和配路由器一样，太复杂了，正在这时，一个工具映入眼帘：&lt;/span&gt;&lt;span  style="color: #333333; font-family: Calibri, sans-serif; font-size: 15px; line-height: 18px;"&gt;&lt;strong&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-02-41-62-36/HttpNamespaceManager.zip" target="_blank"&gt;HttpNamespaceManager&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="font-size: 12px; line-height: 18px; color: #333333; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;"&gt;如图：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011072411304449.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用这个工具，就可以很快将HttpNamespace添加到安全配置中了，将http://+:8000/testservice添加后，异常果然消除了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2115295.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/07/24/2115295.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/07/23/2115127.html</id><title type="text">WCF Web API 第一印象</title><summary type="text">每隔几天，就会打开http://aspnet.codeplex.com去看看有什么动态，前两天无意间打开后发现了一个新东西，WCF Web API，本来我对WWW(WCF,WF,WPF)没有啥好印象，虽然在各大招聘网站上好像需求量倒不小，但是我发现这个Web API貌似是有关REST的内容，于是就多看了两眼，发现果不其然。不幸的是，现在Web API还是preview版本，文档少的可怜，只有源代码和一个几乎没有什么用的Sample，上网搜索也没有结果。前两天看到一句话，大概意思是：前两年大家都在考虑要不要REST，现在已经开始考虑如何REST了。尽管如些，但是在.NET平台上，REST好像还只</summary><published>2011-07-23T15:06:00Z</published><updated>2011-07-23T15:06:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/07/23/2115127.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/07/23/2115127.html"/><content type="html">&lt;p&gt;每隔几天，就会打开http://aspnet.codeplex.com去看看有什么动态，前两天无意间打开后发现了一个新东西，WCF Web API，本来我对WWW(WCF,WF,WPF)没有啥好印象，虽然在各大招聘网站上好像需求量倒不小，但是我发现这个Web API貌似是有关REST的内容，于是就多看了两眼，发现果不其然。不幸的是，现在Web API还是preview版本，文档少的可怜，只有源代码和一个几乎没有什么用的Sample，上网搜索也没有结果。前两天看到一句话，大概意思是：前两年大家都在考虑要不要REST，现在已经开始考虑如何REST了。尽管如些，但是在.NET平台上，REST好像还只是一种概念，研究的人都很少，更不要说投入生产了。关于WCF，刚问世时我倒是学习过一段时间，也做了几个例子，但是引用WCF服务的那种方式我一直不喜欢，在客户端中生成一堆代码，然后再使用那个蹩脚的***Client来调用服务，这就让我产生一个疑问：在两个客户端中调用同一个服务，难道需要生两个Client不成？再则，既然是服务，那就应该是一个&amp;ldquo;开放&amp;rdquo;的东西，虽然WSDL名声显赫，然则过于庞大繁复，如果你想用浏览器来调用WCF的服务，从现实上来说似乎不太可能，如果从浏览器不能调用一个Web服务(当然是GET)，那这个Web服务似乎就不太纯粹；最后，HTTP是一个完善的协议 ，对于操作数据尤为如此，无论多么复杂的需求，最终对于数据而言无外乎增删改查耳，HTTP都具有了，作为一个真正开放、通用的服务来说，使用HTTP的基本方法，几乎没有不能完成的任务。于是对于操作"用户"数据而言，使用GET、POST、PUT、DELETE足已，实在没有必要再自定义一些诸如GetUser，CreateUser之类的RPC方法，为啥一定得要人花一番工夫才能知道添加一个用户到底是用Create还是Add呢？从某种意义来说，每一个网站实际上都是一个Web服务，不是吗？基于HTTP，提供数据，只要你输入对URL，它永远都会将你想要的结果呈现在你的眼前，如果这样一个服务，你要使用类似WCF的框架去提供，使用这个Web服务的人会如何评价呢？他永远不知道在你的&amp;ldquo;服务&amp;rdquo;后面是加一个View还是Get抑或是Display...然而，做技术的人往往喜欢把一个简单的问题想的无限大，然后再整出一个周身毛病的解决方案，等引诱人家去上当，到最终满头包时，才回归到问题本质，推出一个兼顾的方案，如果这还说的不透彻，那么试想，你现在需要剪刀，然而很快专家们就设计出了瑞士军刀，因为他们想到你以后很可能还会需要用...，到最后，你发现你使用几乎天天用剪刀，那些掏耳勺，镊子，起瓶器之类的几乎不用，最后，手里还是拿了把张小泉。记得以前看过一句话：请把牛B还给牛，我想说的是，请把HTTP还给HTTP，无论是在前端还是在服务端。&lt;/p&gt;&#xD;
&lt;p&gt;这两天映入眼帘的东西较多，有IronJS，MongoDB，还有就是正在说的这个WCF Web API了，其实这段时间我正在做一个类似的框架，是在ASP.NET MVC上开发一个轻量级的REST框架(说框架好像有点抬举自已了)，基本思路是使用MVC的Action作为数据服务，使用M$的Syndication来做数据传递格式，使用WebRequest以及WebResponse来手工向服务发起请求以及回传响应，目前支持Atom和JSON格式的内容，核心部分已经完工了，本来打算投入使用后写几篇说明和各位兄弟探讨，但是现在又发现了WCF Web API，这让我很纠结，不知道该是继续呢还是先研究下Web API。昨天把那本《MongoDB权威指南》算是粗读了一遍，今天晚上闲来无事，又把那个WCF Web API的源码包打开看了看，了解下这个所谓的Web API到底是怎么回事，内容不多，但是由于下周有个项目有新需求要增加，而从下下周开始要休假一段时间，因此有必须把今天看的东西记录下来，以免再过20来天，又不知丢到哪里去了。&lt;/p&gt;&#xD;
&lt;p&gt;要了解一个ASP.NET应用的原理，还是得看Global、HttpHandler、HttpModel，在Web API的示例(ContactManager_Advanced)中，没有发现显示使用HttpHandler和HttpModel，那就只能看Global了：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;protected void Application_Start(object sender, EventArgs e)&#xD;
        {&#xD;
            // use MEF for providing instances&#xD;
            var catalog = new AssemblyCatalog(typeof(Global).Assembly);&#xD;
            var container = new CompositionContainer(catalog);&#xD;
            var config = HttpHostConfiguration.Create().&#xD;
                AddFormatters(&#xD;
                    new ContactPngFormatter(),&#xD;
                    new ContactFeedFormatter("http://localhost:9000/Contact"),&#xD;
                    new VCardFormatter(),&#xD;
                    new CalendarFormatter()).&#xD;
                SetResourceFactory(new MefResourceFactory(container)).&#xD;
                AddMessageHandlers(typeof (LoggingChannel), typeof (UriFormatExtensionMessageChannel));&#xD;
            &#xD;
            SetMappings();&#xD;
&#xD;
            RouteTable.Routes.MapServiceRoute&amp;lt;ContactResource&amp;gt;("Contact", config);&#xD;
            RouteTable.Routes.MapServiceRoute&amp;lt;ContactsResource&amp;gt;("Contacts", config);&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;有意义的显然是这段了，&lt;/p&gt;&#xD;
&lt;p&gt;catalog变量是指&lt;a href="http://msdn.microsoft.com/zh-cn/library/dd460648.aspx" target="_blank"&gt;MEF&lt;/a&gt;用于导入的目录，container是组合容器，有了这两个对象实例后，就开始创建一个HttpHostConfiguration的实例，使用一些自定义的Formatter，&lt;strong&gt;Formatter&lt;/strong&gt;是啥用通呢？如果你了解AtomEntry，那就知道，AtomEntry里面实际是一种格式，它定义了一些固定的内容(属性),比如:Id，Title,Summary，Link之类的，对于一个User实体来说，UserName如何表示呢，当能只能去扩展这个AtomEntry了，而这个Formatter就是扩展这个AtomEntry的。&lt;strong&gt;SetResourceFactory&lt;/strong&gt;，这个方法的作用是定义一个资源工厂，啥是资源？在REST中，把用户需要请求操作的服务即称为资源，http://localhost/User，这是一个Url，没错，但是这个Url就代表User服务，它就是个资源，每一个Url就代表一个资源，但是http://localhost/User?id=think8848和http://localhost/User是同一个资源，这其中的道理不难理解，但是设计可访问的资源也是一个比较复杂的话题，这里不做详细说明了，有兴趣的朋友可以参考《RESTful Web Service》一书。那么在这段代码中，到底是如何设置资源，又是如何使用资源的呢？这里使用M$的MEF,MEF是一个比较复杂的框架，简单的说吧，它有点类似于依赖注入，M$对于它定义如下：&amp;ldquo;Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展，而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码，避免生成脆弱的硬依赖项。 通过 MEF，不仅可以在应用程序内重用扩展，还可以在应用程序之间重用扩展。&amp;rdquo;。也就是说，使用MEF，可以获取某些符合条件(通过特性Attribute检索的)的接口实例。在这里设置一个ResourceFactory，当调用到达时，就会在这个ResourceFactory中去找服务的实例，在我们自已的程序中，可以使用其他方法达到资源工厂的功能，比如Ioc框架。AddMessageHandlers这个名字看起来比较直观，以我现在的观察，之前我们使用HttpRequest好像都变成了HttpRequestMessage了，于是我们姑且把这个Message看成是Request，这样，就可以很清楚的看到，AddRequestHandler就是在添加请求的处理程序。&lt;strong&gt;初步猜测&lt;/strong&gt;，&lt;strong&gt;在这个处理程序中，应该能做诸如权限控制之类的工作。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后两句，关键词是MapServiceRoute，这其实是一个扩展方法，就定义在WCF Web API中，方法是为泛型参数类型的服务注册一个UrlRouting的规则，至此，事情就回到了MVC的范畴之类了。&lt;/p&gt;&#xD;
&lt;p&gt;对于WCF Web API，调试了源代码，感觉比MVC框架要复杂的多，今天发现的东西实在很多，还得以后慢慢消化了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2115127.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/07/23/2115127.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/07/19/2110112.html</id><title type="text">jqGrid又一个有用功能:jqGridImport &amp;amp; jqGridExport</title><summary type="text">今天看到一个很好的ASP.NET MVC Razor使用jqGrid的示例，本文正是学习此示例中的一个功能。有关jqGridImport的文档，请参考这里jqGrid还有一个很有用的功能，可以导入和导出jqGrid的配置，这就意味着：使用c#的匿名类加上JsonResult(ASP.NET MVC)用C#的代码生成jqGrid，而不再使用js代码，很多人都怕写js，宁愿写两行C#都不愿意写一行js，这个功能对于不愿意写js的兄弟来说真是一个福音啊，天也不早了，直接上内容吧。Razor下View是这样写的@{ Layout = null;}&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;htm</summary><published>2011-07-18T16:27:00Z</published><updated>2011-07-18T16:27:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/07/19/2110112.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/07/19/2110112.html"/><content type="html">&lt;p&gt;今天看到一个很好的ASP.NET MVC Razor使用jqGrid的&lt;a href="http://tpeczek.codeplex.com/releases/view/61796" target="_blank"&gt;示例&lt;/a&gt;，本文正是学习此示例中的一个功能。有关jqGridImport的文档，请参考&lt;a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:import_methods" target="_blank"&gt;这里&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;jqGrid还有一个很有用的功能，可以导入和导出jqGrid的配置，这就意味着：使用c#的匿名类加上JsonResult(ASP.NET MVC)用C#的代码生成jqGrid，而不再使用js代码，很多人都怕写js，宁愿写两行C#都不愿意写一行js，这个功能对于不愿意写js的兄弟来说真是一个福音啊，天也不早了，直接上内容吧。&lt;/p&gt;&#xD;
&lt;p&gt;Razor下View是这样写的&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;@{&#xD;
    Layout = null;&#xD;
}&#xD;
&amp;lt;!DOCTYPE html&amp;gt;&#xD;
&amp;lt;html&amp;gt;&#xD;
&amp;lt;head&amp;gt;&#xD;
    &amp;lt;title&amp;gt;jqGridImport&amp;lt;/title&amp;gt;&#xD;
    &amp;lt;link href="@Url.Content("~/Content/themes/base/site.css")" rel="Stylesheet" type="text/css" /&amp;gt;&#xD;
    &amp;lt;link href="@Url.Content("~/Content/themes/base/jquery.ui.css")" rel="Stylesheet" type="text/css" /&amp;gt;&#xD;
    &amp;lt;link href="@Url.Content("~/Content/themes/base/jquery.jqgrid.css")" rel="Stylesheet" type="text/css" /&amp;gt;&#xD;
    &amp;lt;script src="@Url.Content("~/Scripts/jquery.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
    &amp;lt;script src="@Url.Content("~/Scripts/jquery.ui.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
    &amp;lt;script src="@Url.Content("~/Scripts/i18n/grid.locale-cn.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
    &amp;lt;script src="@Url.Content("~/Scripts/jquery.jqgrid.js")" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&#xD;
    &amp;lt;script type="text/javascript"&amp;gt;&#xD;
        $(function () {&#xD;
            $('#grid').jqGridImport({&#xD;
                imptype: 'json',&#xD;
                impurl: '@Url.Action("Import", "Home")',&#xD;
                mtype: 'GET',&#xD;
                jsonGrid: {&#xD;
                    config: 'configs'&#xD;
                }&#xD;
            });&#xD;
        });&#xD;
    &amp;lt;/script&amp;gt;&#xD;
&amp;lt;/head&amp;gt;&#xD;
&amp;lt;body style="padding: 10px;"&amp;gt;&#xD;
    &amp;lt;div&amp;gt;&#xD;
        &amp;lt;table id="grid"&amp;gt;&#xD;
        &amp;lt;/table&amp;gt;&#xD;
        &amp;lt;div id="pager"&amp;gt;&#xD;
        &amp;lt;/div&amp;gt;&#xD;
    &amp;lt;/div&amp;gt;&#xD;
&amp;lt;/body&amp;gt;&#xD;
&amp;lt;/html&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这里我对代码中用到的几个选项做个说明，没有用到的请参考&lt;a href="http://www.trirand.com/jqgridwiki/doku.php?id=wiki:import_methods" target="_blank"&gt;这里&lt;/a&gt;的文档&lt;/p&gt;&#xD;
&lt;p&gt;imptype:jqGrid导入"模板"(请允许我给它起了这么一个不伦不类的名称，下同)是json格式的，当然，还可以是xml格式的，但是我想一般也没有人用xml，就没有深究。&lt;/p&gt;&#xD;
&lt;p&gt;impurl:jqGrid导入"模板"是从该url获取的。&lt;/p&gt;&#xD;
&lt;p&gt;mtype:这个简单，是获取导入"模板"的http方法。&lt;/p&gt;&#xD;
&lt;p&gt;jsonGrid：从哪里获取json格式的导入"模板"配置选项，这里稍作解释，从impurl中获取的是一个对象,jsonGrid中的config指的是获取到的这个对象的哪个属性是配置选项，过会看了后台代码就比较好理解了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK，现在来看后台代码是啥样的吧：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public ActionResult Import()&#xD;
        {&#xD;
            var configs = new&#xD;
            {&#xD;
                url = "/User/Index",&#xD;
                datatype = "json",&#xD;
                mtype = "GET",&#xD;
                colNames = new[] { "主键", "姓名", "邮箱" },&#xD;
                colModel = new[] { &#xD;
                    new { name = "ID", index = "ID", width = 200, hidden=true, align = "left" },&#xD;
                    new { name = "Name", index = "Name", width = 200,hidden=false, align = "left" },&#xD;
                    new { name = "Mail", index = "Mail", width = 200,hidden=false, align = "left" } &#xD;
                },&#xD;
                sortname = "Name",&#xD;
                sortorder = "asc",&#xD;
                rowNum = 10,&#xD;
                rowList = new[] { 10, 15, 20 },&#xD;
                pager = "#pager",&#xD;
                viewrecords = true,&#xD;
                height = "auto",&#xD;
                width = "auto"&#xD;
            };&#xD;
&#xD;
&#xD;
            return Json(new { configs = configs }, JsonRequestBehavior.AllowGet);&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;以上这个Action就是提供导入"模板"配置选项的服务，假设你的View名称为ImportDemo.cshtml的话，那么整个请求用到的代码还应该包括一个MVC打开视图的Action:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public ActionResult ImportDemo()&#xD;
        {&#xD;
            return View();&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;最终，只要你开启ImportDemo视图，就会自动到Import服务中获取"模板"&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/1781/2011071900184084.jpg" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/think8848/jqGridImport.rar"&gt;源代码下载&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;附官方文档，很是对不起，昨晚我说官方没有文档，今天早上来就发现了&lt;/p&gt;&#xD;
&lt;h3 style="color: black; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: initial; border-bottom-style: none; border-bottom-color: initial; font-size: 17px; background-position: initial initial; background-repeat: initial initial;"&gt;&lt;a name="importing" id="importing" style="text-decoration: none; color: #000000; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; background-repeat: no-repeat no-repeat;"&gt;Importing&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 1.5em;"&gt;This method reads the grid configuration according to the rules in options and constructs the grid. When constructing the grid for first time it is possible to pass data to it again with the configuration. This is done with jqGirdImport&lt;/p&gt;&#xD;
&lt;pre &gt;jQuery&lt;span  style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span  style="color: #ff0000;"&gt;"#grid_id"&lt;/span&gt;&lt;span  style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span  style="color: #006600;"&gt;jqGridImport&lt;/span&gt;&lt;span  style="color: #66cc66;"&gt;(&lt;/span&gt;options&lt;span  style="color: #66cc66;"&gt;)&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 1.5em;"&gt;Where&lt;/p&gt;&#xD;
&lt;ul style="line-height: 1.5em; list-style-type: square; margin-top: 0.3em; margin-right: 0px; margin-bottom: 0px; margin-left: 1.5em; list-style-image: url('http://www.trirand.com/jqgridwiki/lib/tpl/monobook/monobook/bullet.gif'); padding: 0px;"&gt;&#xD;
&lt;li  style="margin-bottom: 0.1em;"&gt;&#xD;
&lt;div &gt;grid_id is the id of the table element where the grid should be constructed&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li  style="margin-bottom: 0.1em;"&gt;&#xD;
&lt;div &gt;options is array of pair name:value to set different configuration listed bellow&lt;/div&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;table  style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-size: 13px; color: black; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Option&lt;/th&gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Type&lt;/th&gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Description&lt;/th&gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Default&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;imptype&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;string&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Determines the type of import Can be one of the following values xml, json, xmlstring, jsonstring&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;xml&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;impstring&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;string&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;in case of xmlstring or jsonstring this should be set&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;impurl&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;string&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;valid url to the configuration when xml or json. The data is obtained via ajax request&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;mtype&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;string&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Determines the type of request. Can be GET or POST&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;GET&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;impData&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;object&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;additional data that can be passed to the url in pair name:value&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;empty object {}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;xmlGrid&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;object&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;describes from where to read the xml configuration and from where the data if any. The option config describes the configuration tag. The option data describes the data tag&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;config : &amp;ldquo;roots&amp;gt;grid&amp;rdquo;,&lt;br /&gt;data: &amp;ldquo;roots&amp;gt;rows&amp;rdquo;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;jsonGrid&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;object&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;describes from where to read the json configuration and from where the data if any. The option config describes the configuration tag. The option data describes the data tag&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;config : &amp;ldquo;grid&amp;rdquo;,&lt;br /&gt;data: &amp;ldquo;data&amp;rdquo;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;ajaxOptions&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;object&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Additional options which can be passed to the ajax request&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;empty object {}&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;h3 style="color: black; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: initial; border-bottom-style: none; border-bottom-color: initial; font-size: 17px; background-position: initial initial; background-repeat: initial initial;"&gt;&lt;a name="events" id="events" style="text-decoration: none; color: #000000; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; background-repeat: no-repeat no-repeat;"&gt;Events&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;p style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; line-height: 1.5em;"&gt;There is only one event which can be called in jqGridImport.&lt;/p&gt;&#xD;
&lt;table  style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-size: 13px; color: black; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Event&lt;/th&gt;&lt;th  style="background-color: #dee7ec; border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;Description&lt;/th&gt;&lt;/tr&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;importComplete&lt;/td&gt;&#xD;
&lt;td  style="border-width: 1px; border-color: #8cacbb; border-style: solid; padding: 3px;"&gt;This event is called after the successfully import and when the grid is constructed. To this event we pas the request from server. Use this event to set additional parameters in the grid or to construct the navigator&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think8848/aggbug/2110112.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think8848/archive/2011/07/19/2110112.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think8848/archive/2011/07/18/2110069.html</id><title type="text">Northwind,pubs数据库生成脚本(慎入，文本太长，小心卡机，哈哈)</title><summary type="text">今天发一个口水帖，刚才下载了别人的代码想看看，结果人家用了Northwind数据库，而我电脑上又没有，找了好一会儿才在M$的网站上找到，把脚本贴出来，以备不时之需，M$下载地址。Northwind:/*** Copyright Microsoft, Inc. 1994 - 2000** All Rights Reserved.*/SET NOCOUNT ONGOUSE masterGOif exists (select * from sysdatabases where name=&amp;#39;Northwind&amp;#39;) drop database NorthwindgoDECLARE @de</summary><published>2011-07-18T14:55:00Z</published><updated>2011-07-18T14:55:00Z</updated><author><name>think8848</name><uri>http://www.cnblogs.com/think8848/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think8848/archive/2011/07/18/2110069.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think8848/archive/2011/07/18/2110069.html"/></entry></feed>
