摘要: 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题:当我们要给生成的控件设置一些其他的属性(如:id)或者想要设置easyui控件的一些其他的可配置项对于form表单提交时,也要让form表单基于easyui的验证机制来进行验证 这里要先提一下,上一篇的TagBuilder并不是微软自带的(位于System.Web.Mvc下),而是自己实现的,理由嘛,既然我们编码了mvc下对于easyui的扩展,那么同样也可以去扩展普通的web form(后面的文章会再进行扩展),TagBuilder的实现方式跟微软提供的很.. 阅读全文
posted @ 2013-08-19 07:15 ahl5esoft 阅读(3352) 评论(2) 推荐(3) 编辑
摘要: 背景 由于MVC的前端是基于jquery.validate和jquery.validate.unobtrusive来实现的,但是当我们要使用其他的ui组件且组件本身就带有完整的验证功能的话,那么要让它们配合起来是有些麻烦的,比如:easyui。介绍 MVC主要提供了一下几个验证特性来支撑前端的验证: CustomValidationAttribute:指定一个用于验证目标成员的验证类型和验证方法。DataTypeAttribute:指定要与数据字段关联的附加类型的名称。RangeAttribute:用于验证数值字段的值是否在指定的范围之内。RegularExpressionAttribu... 阅读全文
posted @ 2013-08-17 00:13 ahl5esoft 阅读(4974) 评论(9) 推荐(7) 编辑
摘要: 随着Linq的盛行,对于Linq和Lmabda表达式的使用也越来越多,Lambda表达式在.net framework 3.5中提出来,Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托,但是当我们利用Lmabda表达式来实现某些操作的时候,分解内部的表达式树结构就很重要了,例如我们要在一些方法调用当中直接使用 t => t.Name 的方式将属性Name获取出来,这样我们就不用自己去写字符串,且在属性发生改变的时候编译器可以帮助我们进行重构和检测。 当我们要实现以上方式的时候,就不再只是匿名委托了,而是要使用到Expression,它位于System.Linq.Expre 阅读全文
posted @ 2013-07-25 16:39 ahl5esoft 阅读(5892) 评论(6) 推荐(6) 编辑
摘要: C#内我们可以通过反射来动态获取实例方法和静态方法,不管方法存在多少个重载都可以通过GetMethod内的第二个参数去筛选出所要获取的方法,代码如下:type.GetMethod("方法名", new Type[]{ });//第二个参数是方法对应的参数类型数组 但是当我们要获取的是一个泛型方法且该方法存在其他重载方法的时候,就会出现异常,异常如下: 在这种情况下,只能通过将相应方法名的方法全部获取出来,然后通过遍历去查找符合条件的方法,代码如下:var methods = targetType.GetMethods(BindingFlags.Public | Bindin 阅读全文
posted @ 2013-07-24 10:23 ahl5esoft 阅读(4465) 评论(10) 推荐(5) 编辑
摘要: 前段时间使用nodejs实现了简单的mvc,最近一直在使用nodejs围绕着这个简易的mvc进行扩展,力求使其成为一个完整的mvc框架。在http请求中,由于http是没有状态的,为了让客户端保留一些来自服务端的信息,并且在下一次请求中能传递到服务端,那么我们能使用的手段大致分为两种:1、Cookie;2、胖Url。 Cookie是绝佳的客户端存储介质,也是实现持久会话的最好方式,Cookie主要分为2种:会话Cookie(用户退出浏览器时,会话Cookie会被删除)和持久Cookie(生存时间更长一些,它们存储与硬盘上,浏览器退出,计算机重启它们仍然存在)。具体关于Cookie的介绍可... 阅读全文
posted @ 2013-05-22 00:41 ahl5esoft 阅读(4300) 评论(0) 推荐(2) 编辑
摘要: 相信大家对于nodejs应该不会陌生,如果真的比较陌生的请访问:http://nodejs.org或者http://cnodejs.org/了解。 这个简易MVC的结构如下图: 首先需要一个http服务来监听来自客户端的请求,大致代码如下:var m_http = require('http');var m_querystring = require('querystring');var m_requestHandler = require('./requestHandler');exports.run = function (port) { p 阅读全文
posted @ 2013-05-09 14:09 ahl5esoft 阅读(4236) 评论(6) 推荐(9) 编辑
摘要: 在Web端开发中,经常会使用到JSON作为数据源进行交互,C# 4.0中提供了JavaScriptSerializer来序列化和反序列化JSON,它在System.Web.Extension中,由于在JavaScript中,大多数的命名方式都是以Camelcase为主的,可能有些人会跟我一样,对于返回Pascal Case方式的JSON可能会比较纠结,使用过JSON.NET的博友应该知道,它提供了一个CamelCasePropertyNamesContractResolver的类,来序列化Camelcase属性名,但是JavaScriptSerializer貌似并没有提供相应的类,那么接下.. 阅读全文
posted @ 2013-04-15 16:13 ahl5esoft 阅读(1682) 评论(2) 推荐(1) 编辑
摘要: 一、Parse与TryParse 我们以Int32为例,首先看一下Int32提供的Parse和TryPase方法: 从Parse和TryParse方法上我们可以看出它们之间的主要区别在于:如果Prase转换失败则会直接抛出异常;而TryParse在转换失败的时候会返回false,并且将out的Int32值设置为0. 如果我们要使用Parse方法来处理任意字符串转换为Int32类型时,则要编写如下代码:View Code 1 string str= ...; 2 Int32 value; 3 try 4 { 5 value = Int32.Parse(str); 6 } ... 阅读全文
posted @ 2013-04-07 21:48 ahl5esoft 阅读(1768) 评论(4) 推荐(2) 编辑
摘要: 由于最近一直在学习Windows Phone相关知识,而伴随着WIN8的发布,新一代的编程使得很多语言使用唯一的核心库“Winmd”以及可以基于WINRT之上的AppStore环境设计。 而MVVM是一种架构模式,主要在WPF、Silverlight和WP7开发里使用,它的目标是从视图层移除几乎所有代码隐藏(code-behind)。交互设计师可以专注于使用XAML表达用户体验需求,然后创建和视图模型的绑定,而视图模型则是由应用程序开发者开发和维护的,最大好处之一是分离关注点,以便用户体验设计师和应用程序开发者可以并行工作。 稍微了解MVVM以后,我们就开始着手实现MVVM吧。实现的功... 阅读全文
posted @ 2012-09-14 10:38 ahl5esoft 阅读(3058) 评论(12) 推荐(2) 编辑
摘要: 使用过windows phone版QQ的开发者,对于QQ的动态初始屏幕肯定都很关注是如何实现的,关于这个问题首先必须要了解Windows Phone的应用程序生命周期,对于相关的文章博客园内已经有大牛给出了详细的分析,这里就不多说了,详细请看Terry 龙的windows phone7不温不火学习系列文章。 Windows Phone初始屏幕可以通过替换根目录下的SplashScreenImage.jpg来实现,但是这必须要重新发布XAP,用户需要重新安装应用就变得比较麻烦了。很多人可能会想到这样的方案,那就是在主程序加载之前放置控件遮挡主屏幕,然后等程序加载完之后再把相关的控件隐藏起来... 阅读全文
posted @ 2012-08-23 09:20 ahl5esoft 阅读(1337) 评论(0) 推荐(1) 编辑
摘要: 由于早前买了一部windows phone手机,也想借着手机开发一些关于windows phone的软件,先前有尝试做了一款简易备忘软件,最近在学习的过程中,竟然遇到了Canvas,Html5的Canvas跟安卓版本的比较相似,但是跟windows phone的Canvas就有点不同了,今天就试着利用canvas来做一个图片切换的程序。 效果如下: 图片切换的原理就是简单的2张重叠的图片,第一张被剪裁的区域逐渐变大,第二章图片逐渐显现出来。 首先需要一个较大的Canvas容器,用于装载这些需要的图片,XAML代码如下:1 <Canvas x:Name="DisplayCanva 阅读全文
posted @ 2012-08-20 23:44 ahl5esoft 阅读(2487) 评论(0) 推荐(3) 编辑
摘要: 延续着年初计划好的读书路线,陆陆续续看了几本书,由于工作的缘故,仅仅只掌握了相关的语言,C#和javascript,因此绝大部分的书籍都是围绕着这2个语言和相关的编程思想、设计模式等来阅读,但是对于一些底层的知识,对我来说也是有着相当大的诱惑(希望大家多多推荐好书给我),然而当我在阅读《深入理解计算机系统》的时候,发现书中实现原理均以C来实现和讲解,正好我对C有着浓厚的兴趣,借着这次的机会学习一下,虽然前后看了3-4本关于C方面的书,然而由于受到实践的影响,对于C的标准库、指针、变量等也都只是停留在了解的层面上,所以也就只能大略通读《深入理解计算机系统》这本好书了。 每当我看到网上有不少... 阅读全文
posted @ 2012-08-07 09:01 ahl5esoft 阅读(1552) 评论(8) 推荐(0) 编辑
摘要: 因为数组存储在内存中连续的位置上,当使用一个数组在运行时才知道长度的情况下,我们就可以使用动态内存分配。 对于声明时就指定长度的数组来讲,主要有以下几个缺点: 1、需要使用的元素超过数组的长度 2、将数组声明得较大,但是某些情况下的数组元素较少时,浪费比较大 3、使用的元素超过数组长度时,程序必须以一种合理的方式做出相应,而不应该导致异常。 显然动态内存可以让我们在使用的时候不用在意元素的数量大小,我们可以在运行时,使用malloc函数来获取动态内存,如:10、20、30个int所需的内存。 但是malloc并不是每次都能将你所需要的内存返回给你,当某些极少数的情况下,mall... 阅读全文
posted @ 2012-07-03 06:42 ahl5esoft 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 聚合数据类型能够同时存储超过一个的单独数据,C提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,结构则是不同类型的元素的集合。 结构属于标量类型,因此可以像对待其他标量类型那样执行相同类型的操作。 结构声明如下:struct tag { member-list } variable-list; 请看以下声明:struct { int i; char c; float f;} x[20], *y; 以上声明创建了x和y两个变量,x是一个数组,包含20个结构,而y是一个指针,指向这个类型的指针。两个声明被编译器当作两种不同的类型,即使他们的成员列表... 阅读全文
posted @ 2012-07-02 06:34 ahl5esoft 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 在当前WEB当中,有些人都会抛弃asp.net的服务器控件,转而使用ajax来进行数据的交互和存储. 当我们大量使用ajax的时候,对于新手而言,肯定会创建很多的ashx或aspx页面,通过拼接参数,在ashx或aspx中对参数进行解析, 并根据某些特定的参数进行解析来判断当前的请求属于哪种类型的操作,然后手动获取Request.QueryString、Params、Form内的值,来实现功能.大致代码如下:View Code 1 //html 2 名字:<input id="name" type="text"/> 3 <input t 阅读全文
posted @ 2012-06-27 11:19 ahl5esoft 阅读(18092) 评论(18) 推荐(4) 编辑
摘要: 标准库提供了一些用于处理字符串的函数,它们的原型位于头文件string.h中. strlen:用于计算字符串的长度,返回类型是一个无符号的整数,因此将它用于表达式的时候要特别注意,如下:if( strlen(x) <= strlen(y) )//可以正常运行 ...if( 0 <= strlen(y) - strlen(x) )//该表达式永远为真,因为右边表达式的结果将会是一个无符号整数,而无符号数绝对不会为负 ... 所以如果要使用strlen作为表达式,则应该在有符号数的表达式中使用. strcpy:把一个字符串从一个位置复制到另外一个位置,要注意2点:需要复制的字符串... 阅读全文
posted @ 2012-06-27 07:13 ahl5esoft 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 除了优先级不同以外,下标表达式array[index]和间接访问表达式*(array + (value))是一样的。原因就如前一篇文章提到的,数组名是指向数组第一个元素的指针常量,所以下标既可以用于数组名,也可以用于指针表达式,但是当下标用于指针表达式的时候,编译器将失去检查下标有效性的能力,因此在程序可维护性和运行效率上还是要多斟酌。 指针有时会比下标更有效率,下标绝对不会比指针更有效率,前提是他们必须被正确的使用。 虽然下标表达式和间接表达是可以是相同的,但是数组和指针并不相等。除非当数组作为形参时,数组和指针才是相等的,因为实际传递的都是指向数组第一个元素的指针的一份拷贝。但是如... 阅读全文
posted @ 2012-06-26 07:28 ahl5esoft 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 一维数组 首先是对于声明的变量的解释,代码如下:int a;int b[10]; a是一个标量(原先我也是不晓得为什么叫做标量),因为a是一个单一的值,b是数组,是一些值的集合。数组名是一个指向该数组内第一个元素类型的指针,但是数组跟指针是存在一些区别的。 1、数组是能确数量的元素。 2、数组名是常量指针,而指针是一个标量。 *在作为sizeof操作符和&操作符的操作数时,数组名不用指针常量来表示。1 int a[10];2 int b[10];3 int *c;4 ...5 c = &a[0];6 b = a;7 a = c; 第5行是合法的,c为指向数组a第一个元素的指针, 阅读全文
posted @ 2012-06-20 07:28 ahl5esoft 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 递归 C通过运行时堆栈支持递归函数。的哦贵函数就是直接或间接调用自身的函数。 递归函数所需要的2个特性: 1、存在限制条件,当符合这个条件时递归便不再继续。 2、每次调用之后越来越接近这个限制条件。 递归函数在实现方面更加接近问题的抽象定义,也更加清晰,然而在运行时的开销却是非常巨大的。 因此在某些情况下应该考虑用迭代来替代递归,使用递归的时候要慎重考虑。对于开销以及代码实现的清晰度上的抉择要慎重。可变参数 可变参数与C#的params很相似,但是C中是以省略号(...)来表示的,不同的地方是: 1、C中的可变参数必须从头到尾按顺序逐个访问。 2、可变参数没有... 阅读全文
posted @ 2012-06-19 06:53 ahl5esoft 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 指针算数运算 指针可以执行某些运算,但不是所有的运算都是合法的.指针加上一个整数后的结果还是指针. 如果指针加上1,对于所有的类型是否都是指向下一个字符呢?答案是否定的,这会根据指针指向的类型所决定,如:指向char类型的指针,则结果指向下一个字符;指向int类型的指针,则结果则是使指针加4(假设int类型占4个字符). 指针的算术运算只限于+/-,数组中的元素是连续存储的,因此对该指针进行加法元运算,则会使指针移动到相应的数组元素位置. 如果指针的位置在第一个元素之前或者最后一个元素之后,则是未定义,对该指针执行间接地址操作可能会失败. 指针的减法运算的结果是一种有符号的整数类... 阅读全文
posted @ 2012-06-18 07:05 ahl5esoft 阅读(204) 评论(0) 推荐(0) 编辑