All Posts in 2012.10


拓展方法、对象初始化器、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。可是我的博客升级以后就再也没自动过。但是 …