All Posts in 2012


SQL游标的使用

SQL里要做循环比较麻烦,有时候需要用游标(CURSOR)。我是SQL大菜鸟,昨天刚开荒成功了一个游标。发出来备用。 基本语法形式是这样的: DECLARE @临时变量 UNIQUEIDENTIFIER DECLARE 游标名称 CURSOR FOR -- SELECT的结果 OPEN 游标名称 FETCH NEXT FROM 游标名称 INTO @临时变量 WHILE @@FETCH_STATUS = 0 BEGIN -- 对每一条记录的操作 FETCH NEXT FROM 游标名称 INTO @临时变量 END CLOSE 游标名称 DEALLOCATE 游标名称 举个例子,遍历我博客的分类表,输出每一项的Route名称: DECLARE @tempId UNIQUEIDENTIFIER DECLARE @tempName …


毕业生码农防坑纲要

进公司1.5年了,被坑无数。简单整理了一下防坑纲要,已警后人,尤其是毕业生。这些事情也不都是发生在我身上的,做个总结而已,此事不宜在网络上细说。 1. 帮个小忙 如果有人要你过去帮个小忙,我是指,去某个项目里,作为“外聘”帮个“小忙”。请务必非常慎重,因为你很有可能就“一去不复返”了。记得刚进公司不久,我有一位同学,就因为表现比较出色,被提前拉去一个项目组帮了个小忙,结果这个小忙一帮就帮到现在,帮到连部门老大都走了。并且,那时候我们还算是实习,甚至不是“试用期”,但如果你不幸被帮了小忙,很可能就得每天加班了。实习加班是毫无任何福利的。前一阵子我也被帮了个小忙,结果经常被做无意义的需求,和被别人的bug debug,每天为了证明自己的清白在代码里找证据,非常不愉快。 2. 会和不会 毫不客 …


如何从TFS2012上删除Team Project

很久以前,微软就推出了在线版的TFS服务(tfspreview.com),当年还是preview,现在已经是正式版可以在线免费使用了。我很久之前也创建了几个测试用的project在里面,结果现在删不掉了。 可以确定的是,不论在网页版TFS的操作界面上,还是Visual Studio 2012里,都找不到删除Team Project的操作。经过一番谷歌,删Team Project得到CMD里进行。 工具叫做TFSDeleteProject.exe,在你的VS安装目录的这个位置,比如: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE> 具体介绍可以看MSDN上的这篇文章:http://msdn.microsoft.com/en-us/library/ms181482%28v=vs.110%29. …


超详细图解:自己架设NuGet服务器

NuGet 是.NET程序员熟知的给.NET项目自动配置安装library的工具,现在已经整合在了VS2010 SP1和VS2012里。但有时候,尤其在某些公司内部,因为公司防火墙,VS是没办法连接NuGet服务器的。所以我们需要自己架设一个私服。 一、网站构建 首先,确保你的机器在互联网上,并且能够访问NuGet服务器。 创建一个空的ASP.NET网站,选择Framework4(因为考虑到部署问题,很多服务器还没有装.NET4.5,所以我们只能选4) 接下来,用NuGet为这个Web Project安装“NuGet.Server”库。这也是为什么我们需要这台机器能够连接互联网的原因。 安装成功后,你的Solution会变成这样一个结构。并且不需要写任何代码或更改任何配置,它已经可以运行了。但是注意,Packages里只有一个readme.txt, …


Performance tips for Entity Framework

自从我用了EF,每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询,都会使用SQL Profiler看一下实际生成的SQL语句,以便发现潜在的性能问题。也强烈建议大家这么去做,以免日后软件大了出了问题很难查。 一、只选择某列或某些列 有些时候,在C#里写LINQ虽然看着舒服,但性能不一定好,所以有必要做一些调整。比如这种情况: 我需要知道一篇文章的点击数,仅此而已,我可能会写: context.Post.FirstOrDefault(p => p.Id == postId).Hits; 或者: context.Post.Find(postId).Hits; 我期待着他们只去数据库里筛选Hits这一列的数据,然而,通过SQL Profiler会发现,这两条语句居然把全部列都给select出来了,访问Hits的操作实际是在内存中进行的。 虽然小表看不出性能问题,但 …


Fine Uploader 3.0 如何知道所有文件都已上传完毕

最近的项目里用到了Fine Uploader,最新版本是3.0。(原先叫做valums file uploader)。它的官网是:https://github.com/valums/file-uploader,下载在:https://github.com/valums/file-uploader/wiki/Releases。详细文档在GitHub:https://github.com/valums/file-uploader。 我们的一个需求是不能选择完文件后立即上传,而要手动去触发,并且,在上传完毕后,我要得到一个消息,以便下一步处理。但在官网的例子里没有这样的demo。所以我自己开荒了一下。JQuery版本的fine uploader我没开荒成功,所以下面的例子都是用“No-Dependency Fine Uploader”做的。 思路是这样的:在用户触发上 …


如何手工将Entity Framework 4.0升级到5.0

最近在码下一版的博客,其中有个更新就是把Entity Framework升级到5.0。当初建博客的时候是用VS2010自带的EF4的。从4.0升级的过程必须手动完成,通过NuGet的升级,只能自动撸4.1以上的版本。 昨天爆了很久,终于把网站弄得可以运行了。下面分享经验。 第一步:从NuGet安装Entity Framework 5.0 首先,对现有的EF4.0项目,什么都不要改,也不要删。直接从NuGet安装EF5。如果你是.NET4的项目,那实际上安装的是4.4版的DLL,所以EF5的枚举类型是不可以用的。如果你已经升级了.NET4.5,那就是完完全全的EF5。 NuGet会自动给你添加引用以及配置相关的config文件。 第二步:更新EDMX 打开现有的EDMX文件,在空白处点击右键,选择“Add Code Generation Item” …


ASP.NET Web API接受JSON格式复杂对象(嵌套)

上礼拜在公司开荒Web API,被爆出翔了。遇到个具体问题是这样的:Web API中的方法接受的参数是个复杂对象,这个对象里嵌套了另一个对象。但使用API的人不知道如何在JSON里传递复杂对象给Web API。大家一起爆了很久,尝试了各种写法,还是没能解决。 今天我突然想到一个办法,可以获取正确的Nested JSON字符串。并且开荒成功了。与大家分享: 首先,我写的例子是这样的,Product对象里嵌套了一个Category对象,AddProduct的方法接受的是Product对象,我不仅需要Product的信息,也需要被嵌套的Category的信息: [HttpPost] public string AddProduct(Product productModel) { var sb = new StringBuilder(); sb.Append(" …


How to Manually Upgrade ASP.NET MVC3 Projects to MVC4

前几天公司的阿三给我了一项艰巨的任务:码一个MVC4网站。本猿之前只用过MVC3,稍微看了下MVC4,有些地方都变了,如果用默认模板全新做一个MVC4网站得很小心,比如javascript的位置很容易爆出翔来。但好消息是,之前码MVC3的所有知识,都可以用在MVC4上,无需任何代码修改。 作为一个有梦想有目标的屌丝,我如果自己都没认真用过MVC4,以后在公司装逼就没底气了。所以,今天我正好休息在家,查了写资料,成功的把博客从MVC3升级到了MVC4。现在你看到的这个博客,就是稳定运行在MVC4上的。 首先,运行MVC4并不需要IIS8或.NET4.5。它完全能够部署在IIS7、IIS7.5上。所以我不用升级Target Framework的版本。只需要更新MVC4的相关DLL,以及一些config文件就可以完成升级。 按照 http://www.asp.net/ …


给ASP.NET Membership增加权限(Rights)功能

首先说明,本文用的是非常屌丝的办法,针对SQL Server Membership的实现的一个很有局限性的权限模块,而不是真正对ASP.NET Membership本身的拓展。不喜慎入。 一、为什么要给Memebership增加权限系统 我们知道,ASP.NET Membership是基于Role的,其实是个RBAC,没有权限(Rights)功能。也就是说,我们只能够指定某个Role可以做什么事,丧失了一定的灵活性。比如,网站后台有个编辑文章的功能。如果基于Role判断,我只能认为:所有Admin、Editor、Teacher可以编辑文章。在MVC3里,可以用Authorize(Role=”Admin, Editor, Teacher”)的属性做到这一点。然而如果想要动态可配,则比较难了。然而,如果是基于Rights的验证,那我就可以认为:所有具有Edit权限的 …


如何在Outlook2010中移动hotmail的ost文件

今天突然发现Outlook把邮件都存C盘用户目录里了。就像这样:C:\Users\Edi\AppData\Local\Microsoft\Outlook\Edi_Wang_outlook.ost,这文件和你的邮箱一样大,非常占用空间。所以我想把它换个地方放,结果账户设置里,outlook.com(以前的hotmail)的ost文件是个奇葩,数据文件设置里根本没有改ost路径的选项,和网上查到的方法大不一样。 后来看到一个微软猿工回的帖,说hotmail的文件就是这样的,不能移动的。本人菊花一紧,难道是写hotmail connector组件的程序员把这个东西给hard code了? 不过以电脑技巧为生的屌丝们还是有解决办法的: 1. 关掉outlook 2. 把你的巨型ost文件,比如我的(Edi_Wang_outlook.ost)移动到别的位置。比如这里:G:\ …


拓展方法、对象初始化器、var关键词、Lambda表达式、和委托的综合例子

每次和人讲解C#的委托以及Lambda都比较费劲,其实概念是非常简单的,但不好描述。今天写了一个非常简单粗暴直观的例子,来给大家看一下Labmda、委托的用法和关系,顺便也演示了拓展方法、对象初始化器的使用。 我描述的是这样的场景:有3个屌丝,他们每个人都要做两件事,打魔兽和撸撸睡。 首先,我定义了一个屌丝类,描述一个屌丝对象: class Diaos { public Guid Id { get; set; } public string Name { get; set; } } 然后,我们要创建3个屌丝,以往我们用C#来让完成这件事通常会这样写: List<Diaos> diaoses = new List<Diaos>(); Diaos d1 = new Diaos(); d1.Id = Guid.NewGuid(); …


ASP.NET MVC3 TextBox拓展:兼容主流浏览器的PlaceHolder

在MVC的view页面上,我们虽然可以通过给html attribute手写new { @placeholder = "something" }来增加placeholder属性,但这样做对于MVC3框架而言不是非常地道。一个比较好的办法是通过拓展MVC,来增加一个DataAnnotation属性,最终在Model中指定PlaceHolder。下面的方法是我在stackoverflow网站上撸到的,稍作修改并测试后发现非常牛逼,分享给大家。首先,我们要码一个PlaceHolderAttribute类,让它继承Attribute, IMetadataAware两个接口。注意类名是包含Attribute后缀的,但最终使用的时候是只取PlaceHolder这个名字的。(这个机制是.NET自己撸的,我们不用管) public class PlaceHolderAttribute : …


Silverlight程序Debug的方法以及如何在非IE浏览器下调试程序

这篇文章是入门的,高手请直接无视。 一、不能调试的解决办法 在VS里,我们一般调试程序都是直接按F5就行的。但Silverlight的程序有时候加不到断点上来。这时候需要检查几个地方。 1. 当前的Build设置的是Release还是Debug?只有Debug模式才可以调试,这在VS的工具栏上可以直接改。 2. 当前Host Silverlight程序的Web Application是否启用了Silverlight Debug?检查项目属性的这个位置。必须勾选Silverlight才能Debug。 3. 你是否为本机管理员?只有管理员帐号才能正确无误的挂载到Silverlight进程上。 二、在非IE浏览器下调试Silverlight程序。 如果我们的默认浏览器是IE,那么按下F5之后,其实VS会自动挂载到IE的进程上。所以才能debug。因此,我们如果换了一个浏览器, …


ASP.NET MVC3如何用JQuery传递数组(集合)类型参数给JsonResult Action

今天在码新版博客的一个功能,有个细节就是要将一个表格里选中的Id传给后台Action。原先用Form做Post的话,这是非常好实现的,然而现在我要用AJAX完成传递,并且网页上没有Form,所以我也不能用Ajax.BeginForm,肿么办呢?经过一番开荒,我终于把它码出来了。 后台Action是个返回JsonResult的方法,签名如下: public JsonResult ExportSelectedPosts(List<string> selectedIds) 用string集合是因为手写AJAX是不走MVC的model bind的,所以通过网页传递过来的数据只能是string。如果这个方法不加selectedIds这个参数其实也是可以的(最后我们会看到用Request对象一样可以取到值)。但为了符合设计规范,我还是建议大家加上的。 前台的View里这样码(硬编码 …


How to Convert List of Object to List of T in C Sharp

上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List<object>类型,然而该方法需要处理的真实数据则是确定的List<Currency>。然而C#不允许显示的直接转换类型,并且两个方向上都不可以操作。这个问题让我爆了一会儿,最后在MSDN上找到了一个OfType<T>的拓展方法可以完成这件事。 Enumerable.OfType<TResult> 方法: 此方法通过使用延迟执行实现。 即时返回值为一个对象,该对象存储执行操作所需的所有信息。 只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。 OfType<TResult>(IEnumerable) …


MVC3项目升级到VS2012后无法自动bin deploy的解决办法

前不久我把博客升级到了VS2012的solution,结果bin deploy爆掉了。以前在VS2010里,如果打了SP1补丁的话,对MVC3项目点右键,会多出一个菜单,叫做“Add Deployable Dependencies”, 它会在你的项目文件夹里建一个叫做“_bin_deployableAssemblies”的特殊文件夹,里面放的是MVC3项目的几个dll。在publish的时候会自动拷贝到bin目录里。具体可以参考这篇文章:http://haacked.com/archive/2011/05/25/bin-deploying-asp-net-mvc-3.aspx 然而,在VS2012里,这个选项居然木有了。我查阅了官方的说明,说明中居然写着VS2012会自动进行bin deploy。可是我的博客升级以后就再也没自动过。但是 …


Infosys工作一年感触

现在已经快10月了,除去在嘉兴培训的日子,进Infosys工作已经一年了。就这一年里的感受做一些回顾和总结。我会以客观、公正的角度描述这一年的事情,给想要进Infosys的毕业生做一个参考。 1.刚毕业的人不要抱怨工资问题,首先要学会做事 我和我同学比较特殊,是毕业前就来公司的,这可能是学校为了提高就业率而计划的,所以我们是和别的学校的同学一起从嘉兴培训中心毕业到公司的,但转正比他们要晚一年,之前均算作实习。 在Infosys实习,工作时间和内容和正式员工是一样的。实习工资是1800,转正以后是3300(税前)。不少人抱怨工资低,其实我认为,实习的工资不算低,而且说句公道话,刚大学毕业的学生,有几个会做事的?特别是眼高手低的尤其让人讨厌。不谦虚学习,还经常请假,甚至旷工,这态度就不让人喜欢。我本人,不谦虚的说,一样刚大学毕业,但我能做的事很多,但我在态度上不那么娇惯。我想,公司付你钱 …


在Entity Framework中使用LINQ语句分页

我们知道,内存分页效率很低。并且,如果是WebForm的项目,页面上会有巨型ViewState,这必然不好。我自己博客用的是一个存储过程做的分页,用到现在都挺好,没有任何效率问题。后来想到,既然项目里有Entity Framework,那为什么不利用EF完成分页呢~ 稍做研究之后发现,EF分页其实很简单。不过一样写文章了,光贴代码是不负责的,还是得稍微介绍一下相关的知识。 一、页数计算 关于分页的基本原理,网上有很多文章,我就不多叙述了。但我发现很多介绍分页的文章里,计算页码公式都掐掉了,广为流传的版本是: totalPage = totalRecord / pageSize + 1 稍微推敲一下就会发现,这个公式在totalRecord和pageSize正好整除时,会多一页。比如10条记录,每页5条,应该是2页的,但结果是3。然而,不写+1又不行,因为要考虑到记录总数小于页尺寸 …


Store and Read Images via SQL Server in ASP.NET MVC 3

First of all, I don't recommend storing images in the database, especially in a web project. Because file systems can provide static file access and get many benefits such as performance. Storing images in the database has certain limits. But if you must store images into SQL Server, here's how to do it. SQL Image files are in fact, binary data. SQL Server provides us the image type for …


如何在1分钟内完成一个MVC3 Ajax Grid(增删改查)

以前用ASP.NET WebForms的时候,要让一个Gridview支持AJAX,只要扔到一个Update Pannel里就行了,简单粗暴。然而,在MVC里,关于HTML细节的一切都要我们自己写了,没了Update Pannel这样的无脑控件,怎么快速完成一个AJAX Grid呢? 其实微软已经悄悄的在NuGet上放了一个名为“AjaxGridScaffolder”的包,只要用NuGet下载安装,就可以在你的项目里添加AJAX Grid了。它和别的MVC Scaffolder一样,是一种模板,可以根据你的数据库访问类(要求Entity Framework)以及实体类生成支持CRUD的Grid。效果如下: 具体构建方法如下: 1. 确保你的MVC3项目里添加了EntityFramework,并且根据你需要的数据库生成了edmx。 2. 你的网页上引用了 …


JQuery搞定SyntaxHighlighter v3.x长代码自动换行

长代码换行是SyntaxHighlighter3.0版本之前的功能,但3.0之后就木了,草草草草艹!本人认为主要猿因是gutter(代码行号指示器)的换行难做。因为3.x版是将代码行号和代码部分分开生成HTML的,猿来的老版本是在一起的。这样做是便于直接复制代码,而不会复制到行号上去。 很多人都在想办法让它实现换行,但都卡在代码行号的问题上。我关注这个问题已经差不多一年了,今天终于有了个比较漂亮的解决办法。 首先,强制给代码部分换行的CSS还是要写的: body .syntaxhighlighter .line { white-space: pre-wrap !important; } 这段CSS换行的前提是,pre标签的外边一定要有一个固定宽度的容器对象。比如一个600px宽度的div就可以。 然后,我们需要一段JQuery,用来计算被换行的代码显示在页面上的高度 …


SQL Server 授权传递的测试

上周公司有个妹子问了我一个关于SQL Server授权的问题,我没怎么玩过授权,不是很清楚。问题是这样的:如果用户A授权给用户B,用户B再授权给用户C,那么回收A的权限会不会把C的一起回收了。 我以前玩的都是在SQL Server中,给一个数据库添加Windows或者AD帐号,他们都是sysadmin角色,所以删除某个帐号并不影响别的帐号访问。这不适用于妹子的问题,所以今天我特地做了下测试。 测试内容: 用sa(SQL Server管理猿帐号)创建UserA, UserB。然后把SELECT News表的授权给UserA,再让UserA授权给UserB,最后回收UserA的权限,看看UserB还有木有权限。 首先,创建用户的脚本如下: -- Create a SQL Server login named UserA, and then creates a …


博客数据库升级手记(四):XML数据的导入

在上一篇文章中,我已经完成了旧数据库的导入。然而,我的博客原先除了用Access数据库保存数据,也大量使用了XML存储,这借鉴自BlogEngine.NET,但后来发现XML存储弊大于利,最适合我的还是传统关系型数据库。因此,我有必要把所有非系统数据迁移到SQL Server上。这里要提一句,系统数据和用户数据是不一样的。系统数据是维持系统程序的运行所需要的数据,用户数据是用户使用系统产生的数据。系统数据包括系统设置(XML保存)、系统菜单等等,而用户数据除了博客文章,还有其创建的页面、友情链接,这些东西原先都是XML存储的,这次要统一迁移到SQL Server上。 首先,要对应XML的数据结构,在SQL Server中建立对应的表,列名和数据类型可以不一样,但要记得方便导入,不然就得用前几篇文章的技巧处理了。本文以友情链接表为例,建立的表如下: CREATE TABLE [dbo]. …


博客数据库升级手记(三):标签库的导入

上篇文章留下了一个话题,关于标签库的导入。因为设计的变化,标签库无法从Keywords字段中直接导了。 首先,分析一下新表的结构。Tag表是用来保存所有标签的。Tag.Id是uniqueidentifier类型的主键,它将被PostTag表关联,来描述多对多的结构。Tag.Name是标签名称。这是可以从老数据的Blog.Keywords字段中获得的。 所以,第一步,是要从Keywords字段提取信息,插入到Tag表中。随后再处理关联问题。 老数据库里的Keywords字段中保存的,是以英文逗号分隔的文章标签。比如“ASP.NET,CSS,HTML”就表示这篇文章拥有3个标签,分别是ASP.NET、CSS和HTML。首先,我需要解析原先的Keywords字符串,将以逗号分隔的内容解析出来。但SQL Server没有提供Split函数,所以需要自己写一个: …


博客数据库升级手记(二):新数据库的建立及简单数据的导入

前面一片文章讲了如何将Access数据库直接导入SQL Server。但导入完成后,是强烈建议不要使用的。因为里面的object命名都与sql默认的不符,许多T-SQL行为也很诡异,所以我需要重新建立一个数据库,并且把旧的数据导入到新的数据库中。 一、新数据库的设计 对于新的数据库,这恰好是一次重构和升级的机会,我可以将4年前不合理的表结构设计重构一下(4年前也就是我第一次做这个博客的时候,菜鸟一只)。新的数据库中,博客子系统的设计如下(其实还有很多别的表,但不是给博客主业务用的,以后再讨论): 而旧数据库仅仅只有3张表:Blog、Category、Comment。 对于Category,没有太大的改动,仅仅是增加一个”Name”字段,用来做MVC的路由,而”DisplayName”的功能则和原先数据库是一样的,表示这个分类在页面 …


博客数据库升级手记(一):将Access数据库迁移到SQL Server

本人使用的网站空间送了个200M的SQL Server2008 R2数据库,我不用白不用。所以上周花了很多时间把网站从Access和XML数据存储上迁移到了SQL Server数据库,顺便也升级了一下架构,目前博客子系统已基本完成迁移,最近将逐个迁移页面集系统、留言等模块。 在迁移的过程中,有许多值得记录的经验,在实际项目中非常实用,所以记录下来以备参考。 首先,我的迁移思路是:数据的迁移尽量不通过程序去做,应当采用SQL Server去实现。那么第一步我就得把Access数据库迁移到SQL Server上,这样才能在SQL Server中进行一致的管理和迁移到新的数据库上。 我原来的数据库是Access2007格式的(格式没有太大的关系,2003也可以这样操作)。在Access 2010中的操作方法如下: 1. 在Database Tools选项卡下选择“SQL …


ASP.NET MVC3 Model验证总结

ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的。我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证。我以MVC3项目模板自带的登录做例子讲解Model的验证。 一、启用客户端验证: 客户端验证主要是为了提高用户体验,在网页不回刷的情况下完成验证。 第一步是要在web.config里启用客户端验证,这在MVC3自带的模板项目中已经有了: <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 然后在被验证的View页面上要加入这样 …


ASP.NET MVC3调用PartialView的几种方式

我们的网页通常会有好几个部分组成,一些公共的区域我们通常会做成PartialView(部分视图),但这些视图并不是完全固定的,所以还是需要特定的Controller来控制。如果只是静态的html,虽然也可以做成PartialView,但意义不大。下面演示一下MVC3中如何调用PartialView。 首先我们创建一个测试用的Controller: TestController public class TestController : Controller { public ActionResult Message() { var testObj = new List<string>() { "aaa", "bbb", "ccc" }; …


ASP.NET MVC3 AJAX调用JsonResult方法并返回自定义错误信息

一、如何用AJAX调用JsonResult方法 比如FuckController中添加有个返回JsonResult类型的方法FuckJson(): public JsonResult FuckJson() { return new JsonResult() { Data = new List<string>() { "fuck", "shit" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } 如果我们直接在浏览器里调用,是可以看到结果的: 因为在浏览器地址栏直接输入这个地址,是一次GET请求,这就是为毛上面的代码里要写JsonRequestBehavior.AllowGet。 用JQuery AJAX调用的代码如下: $.ajax({ …


在SQL Server完整版上部署ASP.NET Membership

平时做练习的时候,用的Membership虽然是SQL方式的,但版本是SQL Express,连接的是网站App_Data文件夹里的mdf文件。如果要把同样的Membership部署到SQL完整版上是会爆的。比如你开发的时候自己用的Express,部署到你的主机服务商时,人家当然用的付费购买的完整版。这样就会爆。网上查了些资料,说Membership是SQL Express独有的功能,我不相信。所以自己开荒了一下,并且成功了。分享给大家。 首先,连接网站App_Data目录的mdf文件,确实只有Express版可以。所以完整版的SQL Server必须在数据库引擎里建立数据库,不要放在网站目录下。 建完数据库以后,打开VS2010的命令行环境,运行aspnet_regsql,你会看到下面这个界面。 选择第一项,即在SQL Server里配置Application …


Entity Framework作类库项目无法使用using语法的解决办法

最近在玩Entity Framework。我们通常设计程序的时候,会把数据访问、业务逻辑层和客户应用分开做。所以我也希望将Entity Framework生成的Entities放在一个类库中,再用客户程序去使用这个封装好的类库。结果在客户程序里,使用C#自动回收资源的那个using语句的时候居然会报错: 错误消息是这个Entities类型没有实现IDisposable接口。这显然是不可能的。因为将EF放在单个项目中时,这样写是没有问题的。于是我看了下DiaosFixEnities这个类型: 发现这个类型继承自ObjectContext,再看一下ObjectContext类型: 确实集成了IDisposable。根据C#面向对象的特性,DiaosFixEnities应当已经继承了IDisposable接口,但未毛客户程序还报错说没有继承这个接口呢? 观察发现, …


ASP.NET MVC3和传统WebForm共存时,Chart控件无法显示的解决办法

最近把博客的前台改到了MVC3上去,后台还是WebForm做的。一直有个小bug,今天才刚刚解决。后台页面里有个地方用了ASP.NET 4自带的那个Chart图表控件。原来没用MVC的时候是可以显示的。换了MVC之后,WebForm的代码没有改过,其他都好用,就这个Chart爆了。具体表现为,网页没有报错,就Chart的部分显示不出来。今天检查了一下,并最终解决了这个问题。 首先我在firebug里发现,Chart控件生成的图片是来自一个handler的,但加载失败了: 根据最近玩MVC被坑的经验,可能是URL路由引起的。我去后台日志查看了一下,果然是这样的: 解决办法很简单,在Global.asax里写一条忽略URL路由的规则: routes.IgnoreRoute("Console/Dashboard/ChartImg.axd");   但我很奇怪,MVC3默认已经 …


SQL Server 2012中使用ORDER BY OFFSET及FETCH NEXT分页

原文:http://www.kodyaz.com/sql-server-2012/sql-paging-in-sql-server-2012-sql-order-by-offset-fetch-next-rows.aspx 翻译:汪宇杰 SQL Server 2011(译者注:后来重命名为2012)对于T-SQL的特性的增强中,有一个主要的特征就是可以使用“ORDER BY OFFSET n ROWS and FETCH NEXT n ROWS ONLY”语法进行分页。 本文会使用CodePlex上下载的SQL数据库样例AdventureWorks来演示SQL Server 2012 Denali中T-SQL的新特性。 请注意,直到微软把Denali在发布时命名为SQL Server 2012的时候,它在SQL Server社区中本应命名为SQL …


C#创建Windows服务入门图解(VS2010)

Windows服务大家都知道,比如Audio、Theme都是大家比较熟悉的服务,他们可以设为自动启动的,并且在注册表的开机自启动项里是没有痕迹的。所以以前曾经用来隐藏过木马。但以前搞的那个木马服务,是通过手工导注册表来做的。从来没正式的开发过一个服务。 之前做的一个项目里有人用Service的方法定时获取远程数据,很犀利,我感觉还是挺有用的。所以今天我也开荒了一下用C#开发Windows服务,正规的体验了一下开发流程。下面就是我做的最入门的例子,MSDN上有类似的教程,但MSDN漏了一些比较重要的步骤,所以大家请看我开荒成功的版本: 首先,在VS2010里建立一个Windows Service项目: 它会提供我们一个默认的Serivce1,可以删掉,换成自己的。比如Fucker.cs,当然,你得把Program.cs里调用的语句换掉: static void Main() { …


IEnumerable.Where和IEnumerable.Select拓展方法

昨天有个同事在码一程序,处理一个list集合,检查是否有符合条件的项,但不想写繁琐的foreach检查(那样做看上去很2,不专业),于是我就顺手用linq拓展方法给写了。大致如下: if(null != xxx.Select(p => p .... ).FirstOrDefault()) { ... }; 结果发现运行的时候这个条件总是成立的,我蛋都碎了。后来我把.Select换成了.Where就好了。我仔细一看,原来.Select拓展方法遇到后面是条件判定的时候,返回的是bool类型。所以这个if语句自然就永远能走进去了。平时我用Select的时候往往后面跟着new的对象,所以一直没注意到这件事。 今天写了个小demo实验了一下: static void Main(string[] args) { var list = new List<string& …


ASP.NET自定义错误页的正确方法,返回真正状态码而不是200OK

昨天在码页面的时候手写了一次AJAX,蛋都碎了,顺便发现了一个问题。我在ajax的脚本里检查http的返回状态是不是200OK以此来判断ajax是否执行成功。结果发现网站里所有的404、500页面均返回200OK,我蛋都碎了。用Firebug检查了一下,确实如此。这是自定义错误页的问题。如果用了html静态页作为错误页,比如404.html,通常我们的web.config里会这样写: <httpErrors errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL"> <remove statusCode="404" subStatusCode="-1"/> <remove statusCode="500" subStatusCode="-1"/& …


PSEXEC连接远程机器cmd拒绝访问的原因及解决办法

最近在玩一个很牛逼的小工具叫做psexec,知道对方的管理员帐号和密码就可以远程连接对方主机的cmd,对方无需打开远程桌面等任何服务。n年前曾被黑客们用来做过很多坏事,不过这个工具对于网管和程序员来说倒是可以提供不少方便。今天在公司的域环境下试了试,结果居然爆了: 我输入的用户名及密码是正确的(用户名得包含域,即domain\username),并且这个帐号在目标机器上也是有管理员权限的。可是试了好几次都是Access is denied。 于是我登录目标机器,看了下Windows的日志,结果发现psexec发起的这次登录,居然是要用我本机当前用户的身份执行的。我本机执行cmd的用户名如下: 这个会出现在目标机器的Security日志里: 图中,Specail Logon里使用的是psexec参数里的帐号,而Logoff里显示的,却是我本机登录帐号。这个帐号在目标机器上 …


ASP.NET4网站编译时找不到Chart控件的解决办法

最近在努力把博客从WebForms改到MVC3上去,不过后台仍然打算用WebForm开发。结果我把后台的文件复制到MVC Solution下面,改好web.config后,编译的时候爆了: The type or namespace name 'Chart' does not exist in the namespace 'System.Web.UI.WebControls' (are you missing an assembly reference?) 我看了下引用,结果Refence里确实已经加入了System.Web,但这个错误还在。后来我发现WebControls命名空间下根本就没有Chart,这个Chart其实是ASP.NET4自带的控件,应该在“System.Web.UI.DataVisualization”命名空间里。 所以只要添加一个 …


在IIS里部署WCF以及在Service中使用List泛型而不是Array的方法

最近在公司做的是WCF的一个项目,之前从来没玩过WCF,有些陌生。所以把碰到的问题都记录下来以备参考。 首先在IIS里部署WCF很简单。 1. 保证你先有一个网站,并在这个站点上点右键,添加一个应用程序。 2.在弹出的对话框里选择WCF的根目录,并给他起个名字。 3. 如果你的Serivce是.NET4开发的,那就要到应用程序池里改下.NET版本 4. 在浏览器里访问你的service地址,就应该能成功了。 在使用这个Service编程的时候,一开始我发现List类型全变成了Array,也难怪,Serivce的标准就是XML里放的一个个node作为数组的元素。以前用脚本调用的时候就用的是JSON的array,现在在C#里我们其实可以通过设置仍然使用List类型: 1. 在服务引用上点右键,选择配置服务引用(我不知道中文版VS是不是这个名字) 2. 在集 …


ASP.NET MVC3返回404等Http状态码

最近在筹备本人博客下版本的开发工作,准备将网站前台转到MVC3上。以前没有彻底玩过MVC,所以这几天在做练习,比较蛋疼。其中一个需求就是当用户访问不正确的地址时,返回一个404错误。比如阅读一篇已被删除的文章,就需要这样做。 以前在ASP.NET里,我只需要写:Response.StatusCode = 404 就好了,但在MVC3里似乎无效。经过Google我找到了返回404错误的方法。完整代码如下: public ActionResult Detail(string id) { Guid sId = Guid.Empty; if (!Guid.TryParse(id, out sId)) { return new HttpNotFoundResult(); } else { …


Read Excel 2010 via C#

昨天一个同学让我帮忙写个小工具,读一个Excel,只读B列的内容。我拿C#写了一个.NET4的winform程序。虽然简单,但有很多可圈可点的地方,因此撰写本文以警后人。 那个Excel是2010格式的,所以我们先要安装AccessDatabaseEngine,下载地址如下: http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe 这样程序读取Excel的时候就不会抛出OleDb驱动未注册的异常了。 我们先看看Excel文件,格式很简单: 我们需要读的,是B列除标题以外的内容。即B2到B6的内容,观察到它是字符串,所以程序里要作为string读取。 程序界面设计如下,点击ReadExcel后,会将B列的内容显示到 …


ASP.NET中使用Razor导致自定义Membership失效的解决办法

最近在研究Razor和MVC,打算逐步把博客用Razor重写一边。今天一上手就碰到个蛋碎的问题。不管是在MVC应用程序,还是传统的WebForm项目中添加Razor页(既.cshtml类型的页面),就会导致自定义的Membership Provider失效。如果去掉Membership的配置则一切正常。 具体问题表现在有两个地方报错: 1. 运行时报错:Parser Error Message: Default Membership Provider could not be found. 2. 编译时报错:Error    58    The pre-application start initialization method Start on type System.Web.WebPages.Deployment. …


使用批处理及Windows计划任务做每日备份

我们电脑里常常有些重要数据需要定期备份,然而每次都人工操作非常麻烦。并且,在有的特殊情况下,没有办法人工操作(比如公司下班以后,在没人的时候希望服务器做一些数据备份操作)。所以我们需要让Windows自己来完成这些重复性的劳动。 本文的示例是我自己的博客项目,我将创建一个批处理,用于把“E:\WebProject\EdiBlog”文件夹打包压缩,并按日期建立备份文件夹。之后创建一个计划任务,让Windows每天晚上9点运行这个批处理。 首先,批处理很简单,代码如下,将它保存为RunBackup.bat @echo off @SET EXEPATH="C:\Program Files\7-Zip\7z.exe" @SET PROJECTPATH="E:\WebProject\EdiBlog" %EXEPATH% a -tzip "G:\EdiBlogBackup\% …


给编程初学者的建议

本人出于兴趣驱使,从初中就开始研究计算机及编程,但我不是神童,我没有写过9000个软件,也没有90天写过40w行代码,我只是自认为对编程稍有门路罢了。如今快毕业了,在一家挨踢企业实习。在学习的道路上经历了很多,也感悟了很多——编程以外的道理。有些现象让我看在眼里,疼在蛋上。因此我决定撰文,旨在引导编程初学者一个正确的学习方式,帮助他们少走弯路。本文适合大一新生,以及对编程有兴趣的同学阅读。如有意见,欢迎到我邮箱拍砖。edi.wang@outlook.com 一、你为什么要编程 兴趣第一 我必须要说的是,据我观察,以及自身体会发现,要想学好编程,最好的前提条件就是兴趣。但不是每个学编程的人对此都有兴趣,并且,要让一个没有心思研究编程的人静下心来学习这门需要大量时间和精力才能入门的学科,是相当难办的。我的重点不在如何教你去培养兴趣,我不是教育砖家。我要说明的是,如 …


JQuery文本框自动完成,通过AJAX调用ASP.NET WebService

最近在搞博客搜索框的自动完成功能,用的是JQuery UI里的autocomplete插件。插件的数据源是用AJAX调用一个WebService,网站后台有个标签库,WebService返回的是符合条件的标签。最终效果如下: 我们先来看WebService的代码,方法很简单: [WebMethod] public List<EdiBlog.Core.DataModel.TagCloud> GetAllTagsForAutoComplete(string tagName) { return optTag.GetModelList().Where(p => p.Name.ToLower().StartsWith(tagName.ToLower())).ToList(); }  这个方法的作用是根据输入的内容,检索所有以tagName开头的标 …


JQuery AJAX读取ASP.NET WebService泛型方法

这几天在研究JQuery和WebService,被泛型返回类型搞死了。查了很多资料做实验终于搞定了。网上很多垃圾文章的作者都不亲手实验就到处拼凑把东西发上来,太不负责了。下面我发的是100%可用的,经过亲手实验的代码。 首先在WebService上要注意一点,一定记得把[System.Web.Script.Services.ScriptService]这行取消注释,这样脚本才可以调用到WebService。如图: 我用来测试的是我网站的友情链接列表,其WebService方法如下: [WebMethod] public List<EdiBlog.Core.DataModel.FriendLink> GetFriendLinks() { return new EdiBlog.Core.FriendLink().GetModelList(); } 经过测 …


如何在VS2010里更改TFS的本地映射路径

今天GET一个项目文件的时候爆了,TFS说不允许路径长度超过256个字符。尼玛如此坑爹的限制,用户体验实在不好。无奈只能换个路径了。但显示路径的地方直接点击,是打开文件夹,而没有更改路径。尼玛研究了好久这个坑爹设置终于搞定了。这什么用户体验! 1. 在Workspace的下拉列表里,选择Workspaces... 2. 在弹出的对话框中选择Edit 3. 然后,就可以更改Local Folder的位置了 4. 最后,系统会建议你GET一下,于是重新GET就好了 关于TFS命名限制的描述可以在MSDN里找到: http://msdn.microsoft.com/zh-cn/library/aa980550%28v=vs.100%29.aspx


Firefox中强制单元格内容换行

今天在改网站后台的一个表格,里面有个MD5字段,由于页面宽度有限,表格需要换行。于是我给单元格加了如下的规则: word-wrap: break-word; width: 120px;  结果IE里是好的: Firefox中没有任何变化: 后来发现需要给表格(table)元素加个属性: table-layout: fixed;  现在,Firefox下,表格的单元格就可以自动换行了,不过和IE的效果还是稍微有点差别,有些细节的兼容问题避免不了: table-layout属性在W3C的说明中如下: The table-layout property controls the algorithm used to lay out the table cells, rows, and columns. Values auto | …


SQL Server 2012入门图解(二):SQL语句入门

上次介绍了如何在SQL Server中建立数据库和表,并且做备份和还原。这一次将用上次建立的School数据库做演示,学习SQL语句。本文为0基础入门级别,所以介绍的知识非常有限,例子也是最简单的,还是建议大家买本SQL的书学习。 先回顾一下,上次我们建立的数据库和表结构如下: School数据库里只有一张Student表,其中Id是自增长的主键。下面我们以它为例,来演示SQL语句的基本用法。 在SSMS中编写SQL脚本的方法是:点击工具栏上的“新建查询”,在编辑器中输入SQL脚本,选择一个正确的数据库,检查语法正确后,点击“执行”,最后在消息面板可以看到执行结果。如下图: 一、 使用SQL语句创建表 除了前面一片文章介绍的用图形化界面建表,我们还可以用SQL语句来创建表,创建Student表的SQL脚本如下: …


ASP.NET中使用Response方式下载文件

今天在修改我博客的文件管理功能,尝试解决一直以来的一个问题。即IIS中没有注册MIME映射的文件类型,是无法直接用Http Get方式下载的,也就是不能点击超链接直接转向文件位置。比如7z压缩包,如果直接下载,会是这个样子: 后来我想到了以前Gridview输出Excel的方式,是通过Response传输字节流的。稍微查阅了一下,发现ASP.NET的Response对象现在有了一个新的方法:TransmitFile(),不过它在MSDN上的描述不是很详细。 具体做法是这样的: Response.ContentType = "application/x-compress"; Response.AddHeader("Content-Disposition", string.Format("attachment;filename=要输出的文件名")); Response. …


ASP.NET中用Ctrl+S触发按钮事件

这个也是上礼拜印度队友给我留的“作业”,今天搞定了。场景是某个页面,用户输入内容后,希望按Ctrl+S直接提交保存。也就是要用Ctrl+S去触发保存按钮的Click事件。然而在浏览器中,Ctrl+S默认是保存网页(Firefox下就是这样),所以需要写一个可以覆盖浏览器自身快捷键的脚本,去触发按钮事件。 我写了个最简单的Demo,效果如下:点击Button后,会显示一句话以及触发时间。现在需要用Ctrl+S来触发这个事件。注意,先得引入JQuery库。 第一种方法是: $(window).keypress(function (event) { if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) { return …


SQL Server 2012入门图解(一):建表、备份、还原

本文很菜,旨在帮助0基础的初学者入门,高手勿看。关于SQL Server 2012的安装可以看我的这篇文章《SQL Server 2012 Express 安装图解》。 一、建立你的第一个数据库和表 例:建立一个用于描述一个学校学生情况的数据库。把它命名为School。并且要在School数据库下建立保存学生信息的表Student。在可视化界面下,我们通常这样操作。(本文是入门教程,不介绍如何用SQL语句建表) 1.    连接到本地数据库引擎后,右击数据库,选择【新建数据库】。 2.    在弹出的对话框中,把数据库名称设置为School,其他参数保留默认。 3.    刷新视图,可以看到School数据库已经建立成功了。 4.    下面我们要 …


C#读取Excel单元格中的日期

今天写一小程序用来分析某Excel报表,结果在处理日期的时候蛋疼了。 原Excel是这样的: Excel加载到DataTable以后,日期都变成了这个样子: 看起来很像某偏移量。当然也有一部分日期是正常的: 我尝试用DateTime.Parse直接匹配,结果爆掉了。于是查了下MSDN找到了正确的办法:DateTime.FromOADate(double d) 方法: d 参数是一个双精度浮点数字,它将日期表示为基础日期(1899 年 12 月 30 日午夜)之前或之后的天数。 d 的符号和整数部分将日期编码为相对于 1899 年 12 月 30 日的正负日偏移量,而 d 的小数部分的绝对值将当天的时间编码为相对于午夜的小数日偏移量。d 必须为负 657435.0 到正 2958466.0 之间的值。 根据我的Excel,我封装了一下转换函数,如下: …


简单性能测试:使用Stopwatch测算程序执行时间

今天逛博客园,发现有人写了一篇关于List<T>.FindAll()和For循环性能的文章,作者木有给出他的代码,因此不晓得他是怎么测时间的。我以前做这种很简单的性能测试往往都是定义两个datetime,dt1放在算法开始之前,dt2放在算法结束之后。最后用dt2-dt1计算出算法执行的时间。我相信许多人都是这么做的,并且我以前看MSDN Webcast的时候,连微软的MVP都是这样做的。所以我对datetime测时间的方法深信不疑。 不过在那片文章的回复中,我看到有人贴出了一段测试代码,其中用的是Stopwatch类。略有意思,于是研究了一下。 对Stopwatch的描述是这样的: Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。 在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使 …


使用Visual Studio在VMWare虚拟机上远程调试程序

我用的是VMWare8,安装的时候附送了我一个Visual Studio的插件,似乎是跨机器调试程序用的。也就是在主机的VS上调试虚拟机中的程序,看着很牛逼,于是稍微研究了一下。下面是攻略: 我建了个很简单的控制台程序用来演示。断点加在了主函数入口。 第一步:启动虚拟机,我用的是一台XP的虚拟机,记得安装VMWare Tools,要调试.NET程序也当然要安装对应的.NET Framework。然后,去【控制面板\管理工具\本地安全设置\本地策略\安全选项】中,把网络访问:本地帐户的共享和安全模式改成“经典”,如图: 第二步:在虚拟机中增加一个和主机当前登录帐户一模一样的帐户。比如主机的帐户是Edi_Wang,密码是123456,那么虚拟机上也得建立同样的用户,并且放在管理员组,然后用这个帐户重新登录虚拟机。 第三步:打开虚拟机设置,在Options选项卡中,找到 …


Edit Class Template in Visual Studio 2010

在公司里写程序,往往都有规定的代码模板,比如要求每个类都有注释,说明开发者是谁,类的功能,以及其他信息。如果每次建一个类,手工去复制这些信息很麻烦,也容易遗漏。我们可以直接修改VS2010创建类的时候所用的模板,帮我们加上这些信息。 VS的模板位于这个路径:[你的VS安装目录]\Common7\IDE\ItemTemplatesCacheC# Class的模板在 CSharp\Code\[你安装的VS语言版本代码]\Class.zip 比如我的机器上,64位环境,英文版VS(1033),则我可以找到这个位置:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\1033\Class.zip 我们修改这个压缩包里的Class.cs,并保存。重启VS后, …


SQL Server 2012 Express 安装图解

前段时间微软发布了最新最犀利的SQL Server 2012,我第一时间下载回来尝鲜。在3台机器上实验安装了一下,都没有出问题。安装过程和以往类似,写这篇文章的目的是帮助刚接触SQL Server的初学者入门。高手请直接飘过。 首先,安装SQL Server需要注意的是它的版本。微软最新发布的是SQL Server 2012,但目前使用比较广泛的是2008版。对于初学者来说,安装哪个都一样。不过SQL Server 2008或2012都分别包含两种版本。超大的那个,4个多G的,是给企业用的。几百M的是给学生和开发者用的免费版,也就是Express版,它可以从微软的网站上直接下载。本文讲解的是SQL Server 2012 Express(似乎只有Windows7以上版本可以安装),读者可以寻找下面两个连接去下载: http://wwwco1vip.microsoft.com/ …


ASP.NET制作基于的XML导航栏

首先说明,本文为照顾刚入门的新手,有些地方可能会稍微说点基础的东西,高手可以直接忽略。 场景:以前做网站的时候,导航栏的链接都是写死在页面中的,这样不易与维护。于是今天写成了用XML配置的导航栏。用到了LINQ to XML。 先介绍一下功能: 储存导航栏信息的XML文件如下: <?xml version="1.0" encoding="utf-8" ?> <NavigationMenu> <MenuItem Title="Shit" Link="/Fuck" OrderId ="2" Enabled="True" /> <MenuItem Title="Shitter" Link="/Fucker" OrderId ="1" Enabled="True" /> <MenuItem Title=" …


LINQ语句检查空对象的问题

今天在写博客的页面集功能,根据URL去寻找Page,LINQ语句从SitePage的GetModelList()集合中获取符合条件的page,如果查询不到则跳转到404页面。代码是这样的: var page = (from p in optSitePage.GetModelList() where p.VirtualUrlPath.ToLower() == requestTitle.ToLower() select p).First(); if (null == page) { context.Response.Redirect("/404.html"); return; } 我故意传了个不存在的URL,结果linq语句直接报错:System.InvalidOperationException: …


在ASP.NET4中配置和使用Log4net

最近打算更换博客的日志功能,自己写的那个日志模块弱爆了,所以拿著名的log4net试试。查了些资料,自己试了几把,终于成功了。具体方法如下: 首先从官网下载并解压log4net,在项目中添加log4net.dll的引用(官方包的路径是log4net-1.2.11\bin\net\4.0\release\log4net.dll)。这个dll会自动拷贝到网站的bin目录下。 然后在web.config里如下配置。log4net节点没有智能提示,这没关系。配置文件中的file节点是日志文件的路径,可以自己设置,我自己用的是txt文件。 错误描述:%message%newline" / …


JQuery idTabs插件根据URL参数选择Tab

我们的项目用了SunSean的idTabs,但每个tab里的控件会触发postback,或者转到其他页面再转回来,这样当前选中的tab必丢。印度同事不肯用AJAX,无奈今天加班给印度人写个demo,通过回传URL参数来选择tab。 为了做这件事,除了jquery库和idTabs插件,我们还需要下载一个用来搞URL的插件:jquery.url.js,传送门:https://github.com/allmarkedup/jQuery-URL-Parser Tab菜单的HTML代码这样写,每个tab的div自己搞定,不发出来浪费页面了: <div class="tabmenu"> <ul> <li><a href="#idTab1">Dashboard</a></li> <li> …


ASP.NET:如何把ashx写到类库里并在页面上调用

最近在调整博客的架构,进一步把表现和业务分离,所以要把之前用ashx搞的那些Http Handler放到类库中。在类库中建Http Handler的操作很简单,就是添加一个普通的类,然后把之前ashx里的代码几乎一模一样贴到这个类中。但要注意命名空间和类名,因为之后我们会用到。 样例Handler: namespace EdiBlog.Core.Web.HttpHandlers { using System; using System.Web; public class ExampleHandler : IHttpHandler { public bool IsReusable { get { return false; } } …


ASP.NET中处理路径的问题

一、关于相对路径和绝对路径 相对路径转绝对路径 一般,我们在ASP.NET网站中往往需要把一个相对路径转化为绝对路径。通常是用Server.MapPath()方法。比如网站根目录下有个"Uploads"文件夹,那么我们调用Server.MapPath("Uploads")就会返回这个文件夹在服务器上的绝对路径,比如D:\Web1\Uploads。 另一种方法是使用HttpRuntime.AppDomainAppPath,它读取的就是当前网站的运行目录。 关于波浪线: 如果在路径前加上波浪线“~”则表示从网站根目录出发的相对路径。这在引用图片、CSS的时候比较常用。比如“~\Images”。并且这个路径同样可以传给Server.MapPath()用来返回绝对路径。 总是从网站跟目录出发: 在某些场合下,比如网站使用了URL重写组件(注意,不是指MVC网站),则会引发一些路径上的 …


LINQ重写博客垃圾图片回收算法

本人博客后台管理模块有个功能,可以扫描图片上传文件夹下所有未被引用的博客。思路很简单,从所有Blog Model中解析出所有文章使用的图片文件名,排除站外引用,放入一个List<string> usedPicList。再遍历图片上传文件夹,把所有图片文件的结果加入FileInfo[] fiAllPicList。然后比较usedPicList和fiAllPicList,找出所有fiAllPicList中有,而usedPicList中木有的图片,就是未被任何文章引用的垃圾图片了。 原先这个比较算法是用传统方法写的,很蛋疼,用了两重循环,一个标志位才解决问题: List<FileInfo> garbagePicList = new List<FileInfo>(); for (int k = 0; k < fiAllPicList. …


LINQ操作数组(交集,并集,差集,最值,平均,去重复)

数组是大学里经常拿来做算法练习的对象。一些经典算法非常有价值,考试、装逼、面试都十分有用。但现在是效率时代,编程讲究生产效率,利用LINQ,可以让程序猿避免写一些基本算法,把精力花在业务处理上。 下面以数组为例,展示一些常用LINQ操作。 static void Main(string[] args) { int[] a = { 1, 2, 3, 4, 5, 6, 7 }; int[] b = { 4, 5, 6, 7, 8, 9, 10 }; int[] c = { 1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5 }; // 交集 var fuck = a.Intersect(b); // 并集 var shit = a.Union(b); // a有b没有的 …


JQuery操作表格(隔行着色,高亮显示,筛选数据)

最近项目里对表格的操作比较多。以往我们要做一些效果的时候往往通过程序代码来实现,这个努力不值,因为JQuery是完全可以做到的,并且是客户端运行,不经过服务器处理,给用户的反应快,也减少了服务器压力(现在的PC多暴力啊!)。哥查了些资料,写了4个Demo: 1. 隔行着色 $('#table1 tr:odd').addClass('odd'); $('#table1 tr:even').addClass('even'); 效果: 2. 高亮含有特定数据的行 $("#table2 tr:contains('Fuck')").addClass("selected");   3. 筛选数据 $("#filter").click( function(){ $("#table3 .datarow").hide().filter(":contains('ABCDEFG' …


JQuery获取浏览器窗口内容部分高度

有时候我们需要得到浏览器窗口内容部分的高度,而不是整个窗口的高度。我试了下JQuery下的window对象,似乎读的正是内容部分,有点意外,不过恰好满足了我们的要求。 下面是测试代码,记得先引用JQuery库 <script type="text/javascript"> $(document).ready( function() { var h = $(window).height(); alert(h); } ) </script> Firefox下: IE下: 可以发现它获取的却是是窗口的内容部分高度,而不是浏览器窗口的高度。Oh Yeah!


让Repeater和GridView支持DataPager分页

.NET 3.5中的DataPager碉堡了,可惜只支持ListView。传统的GridView和Repeater都无法直接使用DataPager分页。但我们如果稍加改造,就可以让Repeater和GridView支持DataPager分页。本网站的博客和留言板就是用Repeater+DataPager做的分页。 改造办法是自己写一个控件,让它继承GridView或Repeater,并实现IPageableItemContainer 接口。下面要发的是国外某高手写的代码,测试有效。具体使用的时候,要建一个类库项目,把代码编译成dll后,就可以添加到VS的工具箱里了! 一、自定义Repeater using System.Web.UI; using System.Web.UI.WebControls; namespace WYJ.Web.Controls { /// …


关于C# if语句中并列条件的执行

我们知道,当两个条件进行逻辑与操作的时候,其中任何一个条件为假,则表达式的结果为假。所以,遇到(A 且 B)这种表达式,如果A为假的话,B是不是真假都无所谓了,当遇到一个假条件的时候,程序也就没有必要去额外的判断剩下的东西了。C#语言中也是如此。当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了。这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题。一旦之前的条件为真,就会继续执行,执行到抛出异常的条件时,程序就爆了,哈哈。 我们可以写个简单的demo试试。下面的这段代码是坑爹的,之后我会说明原因,但大家可以先从直观的层面上理解一下,最后我会给出正确的测试方法。 static void Main(string[] args) { DataSet ds = null; if (false && ds.Tables[ …


C#字符和ASCII码互转

废话不多,直接上代码。 static void Main(string[] args) { char[] charFucks = new char[] { 'f', 'u', 'c', 'k' }; foreach (var item in charFucks) { Console.Write(Convert.ToInt32(item) + " "); } Console.WriteLine(); int[] asciiFucks = new int[] { 102, 117, 99, 107 }; foreach (var item in asciiFucks) { Console.Write((char)item); } …


JQuery让页脚部固定在网页底部

一般,在网页上,如果内容较少,页脚就会跑到屏幕中间去,可能会让用户感到蛋疼。 上次看了一篇文章,用CSS的办法来固定页脚到浏览器窗口底部。他优点很明显,不需要JS,并且在调整浏览器窗口大小的时候仍然可以自适应,但写法略复杂,如果项目比较赶进度,就不太能用上了。 今天我就遇到了赶进度的蛋疼事情,所以用JQuery简单搞了一个,但本人前端开发水平很烂,有不完善的地方,高手莫喷。代码如下: // 重定位页脚函数 function repositionFooter(){ var h = $(window).height(); $(".innerBlock").css('min-height',h - 230) }; // 用户调整窗口大小时重定位页脚 var resizeTimer = null; $(window).bind('resize', function(){ …


VMWare安装Windows 8 Developer Preview蓝屏的解决办法

昨天晚上想试一下Win8,用VMWare8装了一下,结果在"Getting Devices Ready"的时候爆了: 重启之后,又爆了! 根据经验,这应该是安装硬件驱动的时候爆了,说明Win8无法正确识别VMWare的硬件。但很奇怪,我记得网上说VMWare8是可以装Windows8的。经过一番摸索,终于找到了正确的安装办法: 首先,创建虚拟机的时候要选Custom: 然后选Workstation 8.0 选择 I will install the operating system later. 这里选Windows系统,在Version里选择Windows7,如果你下载的Win8镜像是64位的,就选Windows7 x64 到Network Type这步的时候,选择Bridged networking 然后一路next到虚拟机创建完成。然后打开设置 …


GridView手写事件,包括取主键、取值、更新、选择、删除

刚才在调整网站友情链接管理页面,里面有个简单的GridView。因为更改了架构,所以需要手工给GridView编写编辑、删除等事件。最近也经常碰到有人问我GridView的问题,于是写成经验之书以警后人。 图片是本网站后台的友情链接管理页面: 1. 手写[编辑]功能时,要编写的事件: 一共有3个: RowEditing RowCancelingEdit RowUpdating 前两者的代码比较固定,一般都是: protected void gvFriendLink_RowEditing(object sender, GridViewEditEventArgs e) { gvFriendLink.EditIndex = e.NewEditIndex; FetchData(); } protected void gvFriendLink_ …


ASP.NET生成验证码

好吧,生成验证码不是什么秘密了。原理是产生随机字符,并将字符生成为图片,同时储存到Session里去,然后验证用户输入的内容是否与Session中的验证码相符。下面是本人网站生成验证码的handler: <%@ WebHandler Language="C#" Class="VDC" %> using System; using System.Web; using System.Drawing; public class VDC : IHttpHandler, System.Web.SessionState.IRequiresSessionState { //产生验证码的字符集(去除I 1 l L,O 0等易混字符) public string charSet = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M, …


用LINQ查询XML并绑定给GridView显示

前天嘴贱,建议老Y用XML存一个表格然后绑给GridView,本意是用个偷懒的办法快速解决了那个case,结果做的时候没那么方便,或者说直接把GridView绑定到一个XML文件不太好,如果通过DataTable来处理也显得比较麻烦。 比较好的办法其实是绑给业务对象,就和以前ORM一样做,GridView最终绑的是一个List<数据Model>。那么怎么来读取XML呢最方便呢?当然是用LINQ!可以参考我博客上的这篇文章:http://www.wyjexplorer.cn/Blog/View/EC3073A1BDFB9D90.html 今天抽出来单独写了一个Demo示众,3步搞定! 1.搞个XML文件: <?xml version="1.0" encoding="utf-8" ?> <Contacts> <Person> …


CSS两列布局,左边自适应,右边固定

废话不多说,直接上代码,大家自己看一下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>Layout</title> <style type="text/css"> *{ margin:0;padding:0 } .wrap { …


ASP.NET给用户控件(.ascx)增加属性

我们常用ascx封装用户控件,但我们要访问ascx里的控件的值非常麻烦,如果能给用户控件封装几个属性,就可以在VS的属性面板里进行设置,或者在程序里直接访问“ascx控件.属性值”了。 其实做法很简单,因为用户控件也是一个类,所以我们可以给这个类增加属性,就像设计一个普通的类一样对待。注意,是C#的属性,是public的,而不是字段。 下面的代码演示了我如何将TinyMCE文本编辑器封装为一个Editor.ascx,并给它设置Text属性: ascx页面代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Editor.ascx.cs" Inherits="Console_Editor" %> <script type="text/javascript" src="/ …


高效程序猿之(四)VS2010其他技巧

1.快速打开项目文件夹 一种方法是在开始页面上,对项目点右键,选择“打开所在的文件夹” 另一种方法,是在项目打开后,对解决方案或项目点右键,同样有个“在Windows资源管理器中打开文件夹” 2.重命名 如果要对代码中的一个变量或类名进行重命名,就需要更改所有用到这个类型的语句。手动一个个更改显然会蛋疼。VS给了我们一种高效的重命名办法: 在类型名称上点右键,重构,重命名。更快的办法是将光标点到类型名称上,然后按下Ctrl+R,R 这样,VS就会自动查找和替换所有被引用的名称 3.快速输入相同数据 大家可能知道Word中的矩形选择框,同样,VS2010中也有这个功能,并且现在可以选择0字符宽度的选择框用于输入内容。方法是按住ALT,然后按住鼠标左键选择。 例如下面的实例,我希望给每个标记之前,都加上 ,我可以按住ALT+鼠标左键,选中第一个到最后一个 …


ASP.NET使用ashx输出图片

以前我们在.NET里动态输出图片,往往是建一个aspx,把里面的html代码都删光,然后在cs代码里用response输出一个图片类型的stream。之后指定Image控件的url为这个aspx就行。但是,更好的做法是用ashx。 先简单介绍一下ashx: ashx是ASP.NET里的web handler,用来处理Http请求。因为它不是aspx,所以它无需走aspx的生成过程,避免了事件、控件树等的处理,因此性能比aspx好,并且编写ashx只需要关心request的处理,不用关心web界面上的表现,有点类似JavaEE里的Servlet。动态生成图片这样的事用ashx做再好不过啦! 以我网站Web App里二维码生成器为例。原先生成图片的aspx后台代码如下: protected void Page_Load(object sender, EventArgs e) { …


C#将窗口最小化到系统托盘,并显示图标和快捷菜单

1. 拖一个notifyIcon和一个contextMenuStrip过来,他们会出现在窗体设计器的最下方: 然后完成你的menu,它暂时会出现在form上,但没关系,运行的时候不会显示。 2. 给notifyIcon设置icon属性,这一步很重要,不然系统托盘处不会有图标。然后将ContextMenuStrip属性设置为刚才的那个快捷菜单。 3. 现在运行程序的时候,任务栏右下角系统托盘处就会有我们的图标和菜单: 4. 现在我们来处理最小化隐藏和还原的问题: 首先要将form的ShowInTaskBar属性设为false,这样它就不会在任务栏中显示。但如果现在最小化,屏幕左下角仍然会有一条细小的标题栏。这里我们需要手工处理一下: 在form的resize事件里这样写: private void frmMain_Resize(object sender, …


Windows 7 64位版IIS不能连接Access数据库的解决办法

今天我把系统换成了64位版的Windows7,结果配完IIS打开网站测试的时候,顿时菊花一紧:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。 查了半天发现是IIS跑在64位环境下引起的。而64位下,是木有Access数据库的驱动的(包括Excel也不行)。 解决办法是:在目标网站的应用程序池中选择高级设置,然后将启用32位应用程序设置为true,重启IIS即可!