All posts by 龙生
移动终端和pc浏览器版本检测
/* * 智能机浏览器版本信息: * */ var browser = { versions: function () { var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; } […]
View Details智能判断移动端和电脑浏览器代码
基于移动端的微信和wap网站开发,日益火起来,下面贴一段智能判断分流的代码,希望对菜鸟有所帮助! <?php function isMobile(){ $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "; $useragent_commentsblock = preg_match('|(.*?)|',$useragent,$matches) --> 0 ? $matches[0] : "; } function CheckSubstrs($substrs, $text) { foreach ( $substrs as $substr ) { if (false !== strpos($text,$substr)) { return true; } return false; } $mobile_os_list = array ( 'Google Wireless Transcoder', 'Windows CE', 'WindowsCE', 'Symbian', 'Android', 'armv6l', 'armv5', 'Mobile', 'CentOS', 'mowser', 'AvantGo', 'Opera Mobi', 'J2ME/MIDP', 'Smartphone', 'Go.Web', 'Palm', 'iPAQ' ); $mobile_token_list = array ( 'Profile/MIDP', 'Configuration/CLDC-', '160×160', '176×220', '240×240', '240×320', '320×240', 'UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS', 'PocketPC', 'SonyEricsson', 'Nokia', 'BlackBerry', […]
View DetailsWebBrowser打印设置
webbrowser,居然被用作套打。。。。。。 由于是套打,格式要求很严格,页眉页脚、页边距等等等等。 在网上找到下列代码,做适当修改后基本上能满足要求了,但是由于是用JS修改注册码,因此和客户端的IE设置有很大关系,必须要求客户IE允许Activex。如果不允许,var Wsh=new ActiveXObject("WScript.Shell");将抛出一个异常。 <script language="JavaScript" type="text/javascript"> var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER"; HKEY_Path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\"; //设置网页打印的页眉页脚为空 function PageSetup_Null() { try { var Wsh=new ActiveXObject("WScript.Shell"); HKEY_Key="header"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,""); HKEY_Key="footer"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,""); HKEY_Key="margin_bottom"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_left"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_right"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_top"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); } catch(e){ //alert(e); } } //设置网页打印的页眉页脚为默认值 function PageSetup_Default() { try { var Wsh=new ActiveXObject("WScript.Shell"); HKEY_Key="header"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&w&b页码,&p/&P"); HKEY_Key="footer"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&u&b&d"); } catch(e){} } </script> 第二种方法:直接在.cs文件中写方法。 protected void Page_Load(object sender, EventArgs e) { //PageSetup("", ""); } private void PageSetup(string header, string footer) { Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\PageSetup\\", true); rk.SetValue("header", header); rk.SetValue("footer", footer); rk.SetValue("margin_bottom", 0); rk.SetValue("margin_left", 0); […]
View DetailswebBrowser给documenttext赋值
今天使用webbrowser的时候给documenttext赋值老是没用,查了半天资料才发现要先navigate一下才行 最后的使用方法如下 using (WebBrowser wb = new WebBrowser()) { wb.Navigate(“about:blank"); wb.Document.Write(content); ///需要更改的内容 el = wb.Document.GetElementById("sender"); if (el != null) el.InnerHtml = EnviromentManager.Username; string html = wb.Document.Body.InnerHtml; } from:http://blog.csdn.net/xiao_rory/article/details/6030160
View Details让编程速度慢下来
我老爸经常对我说,“慢点,儿子,这样事情会完成的更快。” 我曾经在旧金山湾区的多家高科技初创公司工作过。现在,我52岁了,我编码时速度慢了、思考的东西多了。 我像一个写代码的设计师;当你读这篇文章的时候你会明显地感觉到这一点:) 最近当我和一些年轻的程序员一起开发一个项目时,慢速编程对我来说是个问题,他们信仰快速实现、迭代式修改代码。开发时,我们被鼓励使用相同的代码库,它就像一大锅汤,如果我们持续地、用力地搅拌它,一个完整的东西就会出现。 然而它不会。 这些程序员中的许多相信所有的工程师都是可替代的这个谬误,以及没人应为代码的任何一方面负责的观点;任何程序员都应能在任何时间改变代码的任何一个片段。毕竟,我们有像github一样能管理、合并任意多的,来自任意数目员工的异步提交的优秀服务。只要每个人经常提交commit,且不破坏任何东西,那么一切都会工作得很好。 扯淡。 你不可能仅靠心意就取代了设计过程。它自文明的曙光以来就一直存在着。而且,即使是那些最新的灵活开发工具,不管它们有多灵活,都不能取代能建立起大教堂,铺设出铁路,拍摄出唱片电影的良好的实践与真实的合作。 同样,再怎么多的编程总量也不能产生一件能节约软件开发时间,把开发速度加快到一堆代码猴子水平的编程工具。 节奏紊乱 让我从快速编程的程序员之中脱颖而出,成为一名慢速程序员的那次意外,其实是一中形式的 节奏紊乱 – 那时候我有一个被其他的程序员笑称是机关枪式迭代的编码节奏. 我的编程风格被描述成拥有各种各样的大小和时间尺度的有机弧线, 其中每一个的开始都是探索、反复尝试以及各种错误、小伎俩,以及临时变量. 基本上,还算是感觉良好. 看上去还是像模像样的. 过段时间后,我会回过头来圈圈点点。每一段弧线的结尾都像是某种准备实现的代码. (“打扫战场”是每个回合结束后必须要折腾的事情). 我编写代码做出贡献的同时,策略、设计方案以及架构上的突发情况不断. 而有时,在一个成熟的机制出现之后, 我却会回过头去重新开始, 因为我那时候就会想到实现某个东西的更好方式. 有时候我是错的。有时候我又是对的. 除非完全成型之后让我眼见为实,否则永远都没办法知道对错. 总而言之,让我们回到一起搞大掺和的程序员们身上. 问题就成了这样: 如果整个软件生态系统没有任何的迟滞和停顿——在发展和应用设计的整个过程中按部就班风平浪静,那么一个人,或者甚至是一个快速的编程者,他是如何做出一个好的设计来的呢? 任何生成快速编程同慢速编程其实一样 (除开前者比较快之外), 都是没有真正理解设计过程的. 同样的原因,很多的神经学家现在都认为类似流体流动的神经元放电会在整个大脑有一种临时占据所有思想和意识的浑(混)响,那就是好的设计需要花费时间. 降低编程速度运动 据wikipedia所说,“降低编程速度运动”是“降速运动”的一部分。这是一种强调仔细设计、品质代码、软件测试与思考的软件开发哲学。这项运动旨在防止不成熟的组装件、有问题的代码和过快的开发周期。 wikipedia同时对“慢软件开发”有着相应的内容:“作为敏捷软件开发运动的一部分,世界上成群的软件开发者期待着具有预见性的项目,旨在获得可持续的职业生涯与工作生活的平衡。他们进行了例如结对工作、代码审查、代码重构等尝试,希望能开发出更令人信赖与强健的软件产品。” 处在旧金山湾区的,由风险投资所支撑的软件开发都是行进在热火朝天的快车道之上的. 在一个流程中资金被动态的投入到了非自然的需求上,其实应该最好是留给设计革新的自然行业节奏上去的. 快并不总是好主意. 事实上,慢一点实际上有时候就意味着更快 – 那种时候所有的东西都是讨论和做好过的. 数字科技是如何侵入我们的自然规律式的节奏的,这一个主题早就被 Rushkoff 的 现实冲击 一问所阐释. 还有另外一个问题: 对技术近乎狂热的崇拜和追求– 迷信般的迷恋着工具. 人们很想知道软件问什么这么烂(是的,它很烂). 软件很烂大都是因为纸上谈兵. 快速的编程者会围绕一些拥有小伎俩的工具去构建一些拥有小伎俩的工具来帮助他们编写代码. 这也是为什么, 我相信软件开发需要各种老人参与其中, 包括: 女性, 教育家, 艺术家. 需要更多的"人-人", 更少的"事-人". 我指的参与, 不是让他们在咨询台服务, 或是装饰下界面(UI flower arranging). 我指的是真正参与开发– 让软件更加人性化. 还好, 我不是码字员. 我的一个朋友, 一个成熟的女性软件工程师, 她有一句名言: “编程不等同于码字”. 虽说这个道理大家都知道, 不过, 常用它来提醒下自己, 也不是什么坏事. Brendan Enrick 也在讨论这方面的问题. 正是因为敲击键盘的是程序员, 才使得这项工作变成了编程, 而不是码字. 说白了, 编程其实就是, 把各种想法, 设计 语言, 逻辑和心智建构(mental construction)存入计算机记忆体中的一项活动. 我的妻子经常走到院子里问我:“你在编程吗?”我的答案常常是“是的”。我经常是在用花园剪修剪树枝或是在移动堆肥。 植物、泥土和剪刀对于编程的作用就像键盘和发光的屏幕一样。 我们正从工业与经济时代过渡到一个可持续发展的年代。是的,新的软件与生意需要生长。然而,为了可持续性,它们需要缓慢地生长,需要我们的呵护,一如我们对待美酒,对待孩子一般。 from:http://www.oschina.net/translate/the-case-for-slow-programming
View Details盘点互联网巨头奉献的十大开源安全工具
Facebook等大型互联网公司推动的服务器与数据中心、大数据工具的开源化项目类似,当大型互联网公司们在超大规模基础设施运营方面面临的挑战 超出技术厂商的能力时,这些巨头就选择反客为主,成为创新技术的推动者和提供者。同样的情况也在信息安全领域中发生着。不少大型互联网公司经常会将自己开 发的顶级安全工具开源,推动整个互联网的安全发展。 本月早些时候安全牛曾介绍过Google开源的web安全测试工具Firing Range、Nogofail以及Facebook开源的Osquery等。 事实上不仅Google、Facebook,包括Netflix甚至Etsy.com这样的电商网站也都贡献过精品开源安全工具。 以下安全牛为大家汇总整理十大互联网巨头的开源安全工具,供大家收藏参考: 一、安全猴 Security Monkey “安全猴”是Netflix三年前开发的一个安全工具,能够对亚马逊云服务的配置进行监控和安全分析,组件功能包括监控各种AWS账号组件,机遇规则的开发和执行活动,在审计规则被触发时通知用户,并存储配置历史信息用作电子取证和审计目的。 二、OSquery OSquery是Facebook刚刚发布的一个安全工具,为安全专业人士提供了一个可调用底层操作系统功能的系统,例如启动进程、加载内核模块、在SQL数据库表中打开网络连接进行查询和监控等。 三、Skyline Skyline是电商网站Etsy技术团队开发的一个类似Nagios的实时异常侦测系统,主要目的是为安全团队提供一个可扩展的被动监控指标体系——可以同时跟踪成百上千的指标。 四、MIDAS MIDAS是Etsy与Facebook安全团队合作为Mac电脑开发的一个轻量级可扩展的入侵侦测系统。开发团队希望从MIDAS开始,企业开始留意OSX系统端点的常见攻击模式。 五、Secureheaders Secureheaders是Twitter送给web开发者的一份大礼,作为一款web安全开发工具,Secureheaders能够自动实施安 全相关的header规则,包括内容安全政策(CSP),防止XSS、HSTS等攻击,防止火绵羊(Firesheep)攻击以及XFO点击劫持等。 六、Google Rapid Response GRR(Google Rapid Response)是Google开发的一个时间响应框架,支持进行远程实时取证。Google将GRR以开源工具的方式与安全界分享,可以作为FireEye/Mandiant 的MIR事件响应平台的替代产品。 七、Scumblr和Sketchy Scumblr和Sketchy是Netflix今年夏天同时发布的两款web应用,可以帮助安全团队监控和记录社交媒体和网络聊天中的安全威胁和攻击。 八、Conceal Conceal是面向Android平台的一组简单的Java API,能够对SD卡等公共存储设备中的大文件进行快速加密和认证。Conceal由Facebook设计,开发者可利用Conceal开发出能适用于老版本Android的内存和处理器开销较低的加密算法。 九、Rappor RAPPOR(Randomized Aggregatable Privacy-Preserving Ordinal Response )是Google上月才发布的隐私工具,能够从终端用户软件采集众包统计数据,同时又不侵犯用户隐私。 十、Moloch Moloch由AOL的技术团队开发,是一个网络流量分析取证工具,能够大规模抓取IPv4数据包,进行索引并存储,可通过一个简单的web界面浏览、搜索和输出所有PCAP数据。 稿源:安全牛 FROM:http://www.oschina.net/news/57334/10-opensource-security-tools
View Details缓存是新的内存
这是一次在 defrag 2014的演讲。 这是经过长时间地多次技术变革后的(多个)技术优势之一。你看到了实际上突破。如果你只是看到了其中的一部分,很难正确推断。你要么短期有进展,要么落后很远。令人惊讶的不是事物变化的速度,而是一点一滴长期工程实践的突破。这是史端乔交换机,一个自动连接电话线路设备,在1891年发明的。 1951年,正是转向数字交换技术之时,一个典型的集中式交换中心基本上还是维多利亚时期的技术的放大版。每个转接过来的电话都有自己单独的strowger交换机。 当时来看,这已经是最牛逼的技术。当然我们看来,这只不过是当时世界上最大的蒸汽朋克(Steampunk,背景设在19世纪的科幻小说)风格的装置艺术(art installations)。 对此感到优越感可能是不对的。虽然集成电路(integrated circuit)已经面世65年了,仍然有数亿计的这种设备嗡嗡咔咔地运行着。直到现在,我们才真正地处在完全电子计算(solid-state computing, solid-state与机械相对,指基于半导体的)的转折点。 最令人兴奋的技术转变,一个是新的模型成为可行,另一个是旧的限制不再存在。在我们的工业界,这两种类型的转变都在上演。 分布式计算(distributed computing)现在是贯穿整个软件栈的主导性的编程模型。所谓的中央处理单元(central processing unit)不再是中心化的,甚至都不是一个单元了。它仅仅算是数据之山(a mountain of data)上爬行的一群虫子(Bugs)中的一个。数据库是最后的堡垒。 同时,内存与硬盘存储间的延迟正在变得无关紧要。30年来,数据库性能的主要关心点,在于访问内存与硬盘存储上的随机数据的巨大差别。既然现在我们可以把数据全部放在内存中,这些烦恼统统不用考虑了。当然不是这么简单,你不能用一个B树,mmap一下,然后就能搞定。在完全基于内存的设计方案推出之前还有很多相关的东西要解决。 这两种新趋势产生了完全崭新的方式来思考、设计、构建应用。现在我们来谈下我们怎么达到,我们怎么做的,未来给我们的启示。 (史前时代,从下文看应该是2000年前,用户被描述成恐龙,作者的小幽默) 那时候,架构图里的每个组件都有一个确定的描述与之相关。每个东西都是一个单独的功能: “the” database(数据库), “the” web server(服务器), characters in a one-room drama(用户). 顺便提一下,这就是“the cloud”这个词的来源。一个轻软/毛茸茸的云是WAN的标准符号,而WAN的细节我们完全不用操心。 (2000年,负载均衡解决一切) 容易实现的分布式计算得到了主流的亲睐。多个完全相同的应用程序服务器藏在一个负载均衡器(load balancer)之后,这个均衡器把负载差不多平均地分配到应用程序服务器上去。只负载均衡那些架构中状态无关的部分回避了很多哲学上的问题(理论上的情况?)。当系统扩展时,这些组件从侧翼包抄,最后包围了“the” database。我们告诉自己,给数据库换上更快的磁盘、更快的CPU很正常,毕竟还是只需要一台机器。硬件提供商很高兴地赚着我们的钱。 (2002:备份解决一切) 最后,数据库备份成为合情合理的,加了一个热备份数据库(hot spare database)后,我们的良心得到些许宽慰。然后我们告诉自己,不会再有任何故障了。当然,这种正确性只存在了几分钟。 当然,热备份经常是空闲的(sitting idle)。一旦商业分析员意识到,他们可以在不触及生产数据的情况下,也能对生产数据进行大规模查询,那么所谓的热备份也几乎跟生产数据一样开始忙碌并且至关重要了。我们又告诉自己,在紧急情况下把热备份暂时拿出来也还好。但这就如同说,我们完全没必要带备胎,因为我们可以从其他车上偷一个过来! (2004:memcached/缓存解决一切) 然后,Brad Fitzpatrick发布了memcached,一个可以在内存中缓存数据的守护程序(因此叫memcached, memory cached)。这是个简化版的分布式哈希表,而且确实非常实用,因而之后就在学术界流行起来。它拥有很多特性:备份(a form of replication?),水平分区,负载均衡,简单数学运算等。 我们再次告诉自己,既然大部分的负载都是读,我们为什么还要催促数据库从磁盘一遍一遍做相同的查询?你只需要一组内存很大的小规模(small-calibre,小口径)服务器,当然硬件提供商也高兴地赚我们(买内存)的钱。 也许需要你写些缓存失效(cache invalidation)代码,这听起来不难,对吧。 (2004:memcached解决一切,添加了缓存失效) 确如其声称,memcached的方案使我们受益很长时间。它把硬盘的随机IO操作替换为内存的随机IO操作。尽管如此,那台数据库机器还是越来越大,越来越忙。我们意识到,缓存的内存开销至少会跟工作集一样大(不然就是无效了),再加上让人不能忍的缓存持久化。我们告诉自己,这就是网络级规模(web scale?)的开销。 (2006:水平分区/切分解决一切) 更令人担心的是应用越来越复杂,越来越聊天化(chattier,可能聊天程序对数据库写的次数很多)。几乎每次都会进行多次数据库写操作。现在,写,而不是读,成为了瓶颈。这时我们才最终认真对待数据库切分。Facebook最初是根据university字段来切分其用户数据,然后做成了"哈佛数据库(The Harvard Database)",并且维持了很长一段时间。Flickr是另一个好例子。他们使用PHP手动建立了一个切分系统,这个系统使用用户ID的哈希值来切分数据库,跟memcached根据key来切分很像。在技术交流会上,他们透露,不得不对数据表去规范化(denormalize),以及对一些对象(比如评论、消息、喜欢)进行两次写(doule-write)。 要解决无限伸缩(infinite scaling)总要付出点代价,对吧。 (2008:NoSQL解决一切) 手动切分关系型数据库的问题是,你的关系型数据库已经没了。切分API实际上成为你的查询语言了。你对操作的头疼还没好,而修改一组模式(schema)更加痛苦。 这就需要大家深呼一口气,列出大家选用的SQL实现的所有不足和瑕疵,然后因此责怪SQL。一波潮人似的NoSQL,难民似的XML数据库出现了,并且都作出了根本办不到的承诺。它们提供了自动切分,灵活的模式,一些冗余,…,一开始也就这么多。但是总比自己写要好多了。 你知道,“不用自己写”成为主要卖点的东西总是令人绝望。 (2010:Map/Reduce解决一切) 转移到NoSQL并不比使用手动切分差,因为我们已经放弃了使用常用的客户端工具控制和分析数据的希望。但这没好多少。之前由商业人员(business folks)编写的SQL查询变成了开发人员维护的报表代码。 还记得用于备份和分析的热备份数据库吧?现在它变身为Hadoop filestores以及上层的Hive查询而卷土重来了。既然奏效,商业人员再也不来烦我们了。但一个大问题是,这些系统的操作复杂性。就像航天飞机一样,它们是作为可靠且几乎不用维护的产品出售的,但是最后还是需要大量的手动操作。另一个大问题是,数据的存入和取出:花费一整天的时间已经相当不错了。第三个大问题是IO同时成为网络和磁盘的瓶颈。我们告诉自己,这就是从大数据(big data)毕业的代价。 不管怎样,Google就是这样做的,对吧。 (2012:NoSQL再次解决一切) 随着一些NoSQL数据库的逐渐成熟,它们的API发生了诡异的变化:它们开始长得像SQL一样。这时因为SQL是关系型集合理论(relational set theory)的相当直接的实现,而数学不是那么好愚弄的。 我重述下Paul Graham对Lisp那难以忍受、并自鸣得意的评论:一旦你添加了group by, filter, join,你也不能声称发明了新的查询语言,因为这仅仅算是SQL的一个新方言。而且语法很差,还没有优化器。 由于我们绕过了SQL,大部分系统都缺少了一些很重要的东西,比如存储引擎、查询优化器,而这些都是基于关系型集合理论设计的。拖延到后期去实现导致了严重的性能问题。即使对解决了性能问题的那些(或者通过停驻在内存中来掩盖此问题),也缺少了其他东西,如合适的备份。 我知道一个非常成功的互联网初创公司(你肯定也听过)使用了4个(!!)不同的NoSQL系统来解决问题。 (2014:现在需要什么来解决一切?) 现在已经相当明显,我们不会回到单数据库以及10毫秒一次的随机定位(10-million-nanosecond random […]
View DetailsUPS电源的类别
非在线式UPS也称后备式UPS 平时处于蓄电池充电状态,在停电时逆变器紧急切换到工作状态,将电池提供的直流电转变为稳定的交流电输出,因此后备式UPS也被称为离线式UPS。后备式UPS电源的优点是:运行效率高、噪音低、价格相对便宜,主要适用于市电波动不大,对供电质量要求不高的场合,比较适合家庭使用。然而这种UPS存在一个切换时间问题,因此不适合用在关键性的供电不能中断的场所。不过实际上这个切换时间很短,一般介于2至10毫秒,而计算机本身的交换式电源供应器在断电时应可维持10毫秒左右,所以个人计算机系统一般不会因为这个切换时间而出现问题。后备式UPS一般只能持续供电几分钟到几十分钟,主要是让您有时间备份数据,并尽快结束手头工作,其价格也较低。对不是太关键的电脑应用,比如个人家庭用户,就可配小功率的后备式UPS。 在线式UPS 在线式UPS在工作时,首先将市电转化为直流电给UPS电池充电,同时逆变器(见提示)将此直流电逆变为交流电为负载供电,由于市电经过了交流到直流、再到交流的转换过程,所以市电中原有的干扰和脉冲电压成分已经过滤得非常干净,因此,由在线式UPS逆变出来的电压很稳定。由于逆变电路始终在工作,所以当停电时,UPS能马上将其存储的电能通过逆变器转化为交流电对负载进行供电,从而达到了输出电压零中断的切换目标。另外广告里提到的双变换就是指这款UPS的输出电压经过了两次交直流的互相转换过程。而高频则表示UPS内部工作在高频环境下。高频UPS的好处是体积小,重量轻,工作效率高,其坏处是抗过载抗冲击能力差。
View DetailsASP.NET MVC 中 WebGrid 的 6 个重要技巧
介绍 当一个 Webform 开发者转做 MVC 开发的时候, 他会发现, 许多自己喜欢的东东不见了. 没有代码隐藏模型(behind code), 没有 view state, 没有页面生命周期(page life cycle), 没有服务端控件(server control). 你可以看这篇文章, 里头有讲 MVC 比 ASP.NET Webform少了哪些东西. 没有了这些易用的服务端控件, 相信许多人都会伤心欲绝. 最令人怀念的, 恐怕要属 gridview / datagrid 控件. 作为一个 ASP.NET Webform 开发者, 我能理解, 这种将 GridView 控件拖放到 form 里头, 然后给它绑定数据, 一会的功夫, 就能看到数据在表格中显示的开发过程, 有多爽, 多让人着迷. MVC 用 “WebGrid” 类代替 GridView . 这是个类, 再说一次, 这是个类. 别指望它能像, 有可视化快速开发工具支持的 gridview / data grid 控件那么好用. 不过要比用 HTML 的表格好的多, 起码省时间. 如果你想知道, 我们为什么不做可视化快速开发工具支持 MVC, 读下这篇文章 ASP.NET Webform 对比 ASP.NET MVC. 本文通过六个重要技巧, 教你如何更有效的使用 WebGrid。 一个简单的 MVC WebGrid 例子 “WebGrid” 的用途是, 显示集合(collection )中的数据. 集合可能是强类型列表(strong typed list), 也可能是泛型, 或其他类型. 我们先来看一个简单的例子. 这个例子将强类型对象添加到一个集合中, 然后用 “WebGrid” 显示出来. 下列代码创建一个名叫 “Custs” 列表, 然后把 “Customer” 类的 对象加进去. ? 1 2 […]
View Details25 个免费简洁的 WordPress 主题和布局插件
Editor Demo Download Editor 是一个排版驱动的主题,内容在右侧展示,非常漂亮,支持移动设备浏览。 Daily Theme Demo Download 响应式布局可用于博客、相册。 Illustratr Download Download 一个微型的相册主题 Fukasawa Demo Demo Fukasawa 是适合摄影人和收藏夹使用的 WP 主题 Espied Demo Download A portfolio theme for designers and photographers. Great for showing off your image oriented projects to the world. Cody Demo Download Simple WordPress Theme for blogs and personal websites. Sketch Demo Download 整洁、响应式的组,提供网站 Logo 自定义,特色是内容滑块。 PURE WORDPRESS THEME Download Pho – Minimalist, Masonry WordPress Theme Download Pho WordPress 是一个微型的博客主题,提供漂亮的排版,大量的空间可用于展示漂亮的大图片 Hoffman Demo Download Hoffman 适合用来做博客主题 Moments Demo Download 响应式主题,适合个人博客 CleanPort Lite WordPress Theme Demo Download CleanPort 是一个平面设计的风格。 Rams Demo Download Time Demo Download Ravel Demo Download Bridging […]
View Details