2月16
https://my.oschina.net/u/1458120/blog/208857
2月12
熟悉IoC容器的都知道,在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况,
如果你的页面是直接发送请求的,那么会得到类似于如下页面的错误:
如果该服务是用于AJAX请求实用的,那么你就悲剧了,因为页面只是没反应,只有查看错误日志了。
2月8
隐式代码表达式
就是一个标识符,之后可以跟任意数量的方法调用("()")、索引表达式("[]")及成员访问表达式(".")。但是,除了在"()"或者"[]"里面,是不允许空格存在的。
例如,下面是一些合法的Razor隐式表达式:
[codes=c#]
@p.Name
@p.Name.ToString()
@p.Name.ToString()[6 - 2]
@p.Name.Replace("ASPX", "Razor")[i++]
[/codes]
下面是一些非法的表达式,这些表达式只有部分("==>"之后的部分)会被Razor认为是表达式。
[codes=c#]
@1 + 1 ==> @
@p++ ==> @p
@p . Name ==> @p
@p.Name.Length – 1 ==> @p.Name.Length
[/codes]
这是我们为什么需要另一个表达式语法:"@(...)"的原因,通过这个语法我们可以把任何想要的东西放到"()"里面,上面的例子用这个语法来表示就是:
[codes=c#]
@(1 + 1)
@(p++)
@(p . Name)
@(p.Name.Length - 1)
[/codes]
而这种表示方法就是 显示代码表达式。
就是一个标识符,之后可以跟任意数量的方法调用("()")、索引表达式("[]")及成员访问表达式(".")。但是,除了在"()"或者"[]"里面,是不允许空格存在的。
例如,下面是一些合法的Razor隐式表达式:
[codes=c#]
@p.Name
@p.Name.ToString()
@p.Name.ToString()[6 - 2]
@p.Name.Replace("ASPX", "Razor")[i++]
[/codes]
下面是一些非法的表达式,这些表达式只有部分("==>"之后的部分)会被Razor认为是表达式。
[codes=c#]
@1 + 1 ==> @
@p++ ==> @p
@p . Name ==> @p
@p.Name.Length – 1 ==> @p.Name.Length
[/codes]
这是我们为什么需要另一个表达式语法:"@(...)"的原因,通过这个语法我们可以把任何想要的东西放到"()"里面,上面的例子用这个语法来表示就是:
[codes=c#]
@(1 + 1)
@(p++)
@(p . Name)
@(p.Name.Length - 1)
[/codes]
而这种表示方法就是 显示代码表达式。
2月8
[codes=c#]
首先在Models文件夹下添加cs文件类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//using System.Web.Mvc;
using Microsoft.SqlServer.Server;
namespace System.Web.Mvc//这里为了在页面中不需要引入命名空间
{
public static class MyHtmlHelperExt
{
public static string MyLabel(this HtmlHelper helper,string str)
{
return string.Format("{0}",str);
}
public static HtmlString MyHtmlStringLabel(this HtmlHelper helper, string str) //扩展防止被编码化
return new HtmlString(string.Format("{0}", str));
}
}
}
view页面使用实例:
<%:Html.MyHtmlStringLabel("你好") %>
[/codes]%:html.myhtmlstringlabel("你好")>
首先在Models文件夹下添加cs文件类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
//using System.Web.Mvc;
using Microsoft.SqlServer.Server;
namespace System.Web.Mvc//这里为了在页面中不需要引入命名空间
{
public static class MyHtmlHelperExt
{
public static string MyLabel(this HtmlHelper helper,string str)
{
return string.Format("{0}",str);
}
public static HtmlString MyHtmlStringLabel(this HtmlHelper helper, string str) //扩展防止被编码化
return new HtmlString(string.Format("{0}", str));
}
}
}
view页面使用实例:
<%:Html.MyHtmlStringLabel("你好") %>
[/codes]%:html.myhtmlstringlabel("你好")>
2月8
本文目的
我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index:
[codes=c#]
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new DemoModel {Email = "test@test.com"};
return View(model);
}
}
public class DemoModel
{
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
[/codes]
创建对应的强类型视图
[codes=c#]
@model TestMvc.Controllers.DemoModel
[/codes]
运行一下,如果你的RP不是非常不好的情况下,会出现下面的结果:

生成的是一个Email的链接。看一下email部分对应的html源文件:
[codes=c#]
[/codes]
对于不求甚解的人来说,这很正常啊,正常的就像1+1=2一样。但对于勤学好问的同学来说,问题来了。
为什么生成的是一个email链接,不是一个纯文本?
因为我用DataType指明了它是email!
那DataType是如何指导Model生成html的?
如果你对这些问题感兴趣,请你看下去。
Model的兄弟--ModelMetadata
在介绍Model如何能在View中正常显示之前,不得不提一下他的兄弟ModelMetadata这个类。ModelMetadata实现对Model的一些特征进行描述(如Model的类型、Model的值,Model要显示的模板 ),并且实现了对Model的所有属性值进行描述(递归结构)。有了这个兄弟,Model才能知道如何在View中正常显示【注意:这里特指的是用HtmlHelper的系列扩展方法(如Display/DiaplayFor/EditorFor等)方法在View中显示。如果你是在View中直接取Model的值用html显示,你可以暂不用关心ModelMetadata。但!!不要觉得这样你就不用了解ModelMetadata了,因为MVC中还有一个核心与它息息相关---Model绑定与验证,所以我建议你还是先认识一下这位好兄弟】,让我们来看看这个兄弟长什么样:
[codes=c#]
public class ModelMetadata
{
private readonly Type _modelType; //Model的类型
private readonly string _propertyName; //属性名称
private object _model; //Model的值
private Func
我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index:
[codes=c#]
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new DemoModel {Email = "test@test.com"};
return View(model);
}
}
public class DemoModel
{
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
[/codes]
创建对应的强类型视图
[codes=c#]
@model TestMvc.Controllers.DemoModel
[/codes]
运行一下,如果你的RP不是非常不好的情况下,会出现下面的结果:
生成的是一个Email的链接。看一下email部分对应的html源文件:
[codes=c#]
[/codes]
对于不求甚解的人来说,这很正常啊,正常的就像1+1=2一样。但对于勤学好问的同学来说,问题来了。
为什么生成的是一个email链接,不是一个纯文本?
因为我用DataType指明了它是email!
那DataType是如何指导Model生成html的?
如果你对这些问题感兴趣,请你看下去。
Model的兄弟--ModelMetadata
在介绍Model如何能在View中正常显示之前,不得不提一下他的兄弟ModelMetadata这个类。ModelMetadata实现对Model的一些特征进行描述(如Model的类型、Model的值,Model要显示的模板 ),并且实现了对Model的所有属性值进行描述(递归结构)。有了这个兄弟,Model才能知道如何在View中正常显示【注意:这里特指的是用HtmlHelper的系列扩展方法(如Display/DiaplayFor/EditorFor等)方法在View中显示。如果你是在View中直接取Model的值用html显示,你可以暂不用关心ModelMetadata。但!!不要觉得这样你就不用了解ModelMetadata了,因为MVC中还有一个核心与它息息相关---Model绑定与验证,所以我建议你还是先认识一下这位好兄弟】,让我们来看看这个兄弟长什么样:
[codes=c#]
public class ModelMetadata
{
private readonly Type _modelType; //Model的类型
private readonly string _propertyName; //属性名称
private object _model; //Model的值
private Func
2月7
问题:
项目上线后发现一个问题,项目记录流水的时间是取自本地的时间new Date(),之前一直正常,最近发现异常
经过日志发现时终端设备时区设置异常,但诡异的是终端APPrequest提交的时间戳是正常的……
撸一撸
日志中显示记录流水时间是:2017-02-07 08:16:55,为伦敦时间,
而正确的时间应该是2017/2/7 16:16:55,这就导致终端APP界面显示异常,
但request提交的是时间转换的时间戳:Math.round(new Date("2017-02-07 08:16:55".replace(/-/g, '/')).getTime()/1000)
why
什么是时间戳(timestamp)?它和时区(timezone)又有什么关系?初学者可能一开始很难搞懂时间戳这个概念,就像这期《程序员的日常》漫画中的主人公一样。

漫画注释
从漫画中举的例子来看,这里的时间戳,指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。
Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他操作系统中被广泛采用。但是,这并不意味着目前的时间戳规范会一直持续使用下去。 因为到2038年1月19日时,Unix时间戳就会因为32位内存溢出(32-bit overflow)而无法继续使用。因此,在这一天之前,上千万的网络应用要么采用新的时间戳规范,要么迁移到64位系统,后者可以给时间戳争取“一点”时间。
引用
项目上线后发现一个问题,项目记录流水的时间是取自本地的时间new Date(),之前一直正常,最近发现异常
经过日志发现时终端设备时区设置异常,但诡异的是终端APPrequest提交的时间戳是正常的……
撸一撸

日志中显示记录流水时间是:2017-02-07 08:16:55,为伦敦时间,
而正确的时间应该是2017/2/7 16:16:55,这就导致终端APP界面显示异常,
但request提交的是时间转换的时间戳:Math.round(new Date("2017-02-07 08:16:55".replace(/-/g, '/')).getTime()/1000)
why
什么是时间戳(timestamp)?它和时区(timezone)又有什么关系?初学者可能一开始很难搞懂时间戳这个概念,就像这期《程序员的日常》漫画中的主人公一样。
漫画注释
从漫画中举的例子来看,这里的时间戳,指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。
Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他操作系统中被广泛采用。但是,这并不意味着目前的时间戳规范会一直持续使用下去。 因为到2038年1月19日时,Unix时间戳就会因为32位内存溢出(32-bit overflow)而无法继续使用。因此,在这一天之前,上千万的网络应用要么采用新的时间戳规范,要么迁移到64位系统,后者可以给时间戳争取“一点”时间。
1月5
let no="u0000u0000u0000u0000u0000u0000u0000Ou0000u0000u0000u0000u0000u0000u0000u0000"
no = no.replace(/\u0000/g,"");
\u0000是unicode表示的一个特殊字符,也就是二进制的0,在c里面用这个字符作为字符串结束的标志。
正是因为这个原因,造成调用某些方法的时候字符串被截断。例子:
<textarea id="ff"></textarea>
<script>
var x = 'xxx\u0000yyy';
alert(x);
alert(x.length);
var elm = document.getElementByIdx('ff');
elm.value = x;
y = x.replace('\u0000', ' ');
alert(y);
alert(y == 'xxx\u0000yyy');
alert(y == 'xxx yyy');
alert(elm.value.length);
alert(elm.value == 'xxx\u0000yyy');
alert(elm.value == 'xxx yyy);
</script>
本身声明这个字符串的时候是可以接受\u0000的,所以长度什么的都对
但是通过alert调用的时候,字符串就被截断,认为到\u0000就结束了
同样当作一个字符串赋值给一个textarea的时候,也被截断了(IE6)。
对于firefox,不被截断,textarea.value的值就是'xxx\u0000yyy'
12月22
使用AJAX封装HTTPS请求,对request数据进行JavaScript加密库Crypto-JS加密,对于response数据库进行解密,可以参考:AES(高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准)
参考文档:
https://www.npmjs.com/package/crypto-js
https://my.oschina.net/jack230230/blog/69826
参考文档:
https://www.npmjs.com/package/crypto-js
https://my.oschina.net/jack230230/blog/69826
12月22
HybridAPP中,H5页面在ios系统中页面会被拖动,出现webview的底部颜色,引入此插件完美解决问题,不依赖任何第三方库!如果页面中有需要滚动的div元素,增加css样式-webkit-overflow-scrolling: touch;即可
,请访问:https://github.com/freedomdebug/iNoBounce
,请访问:https://github.com/freedomdebug/iNoBounce
10月17
Vue.js 是用于构建交互式的 Web 界面的库。它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单、灵活的 API。从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并通过双向数据绑定连接视图和模型。实际的 DOM 操作和输出格式被抽象出来成指令和过滤器。相比其它的 MVVM 框架,Vue.js 更容易上手。
Vue.js 是一个用于创建 Web 交互界面的库。它让你通过简单而灵活的 API 创建由数据驱动的 UI 组件。
适用人群
即便您已经熟悉了一些这类的库或框架,我们还是推荐您继续阅读接下来的概览,因为您对它们的认识也许和它们在 Vue.js 语境下的定义不尽相同。
学习前提
Vue.js 的 API 是参考了 AngularJS、KnockoutJS、Ractive.js、Rivets.js。所以建议学习前,对上述 4 个框架系统做些了解。
Vue.js是一个在谷歌的哥们用了一段时间angularjs之后甚感不爽,例如脏watch,factory,service,provider之类不清晰,然后自己也diy了一把,基于观测者模式,指令,filter重新造另一个轮子,当然这个轮子能否持续下去还要看社会是否会持续火热了
Vue.js 是一个用于创建 Web 交互界面的库。它让你通过简单而灵活的 API 创建由数据驱动的 UI 组件。
适用人群
即便您已经熟悉了一些这类的库或框架,我们还是推荐您继续阅读接下来的概览,因为您对它们的认识也许和它们在 Vue.js 语境下的定义不尽相同。
学习前提
Vue.js 的 API 是参考了 AngularJS、KnockoutJS、Ractive.js、Rivets.js。所以建议学习前,对上述 4 个框架系统做些了解。
Vue.js是一个在谷歌的哥们用了一段时间angularjs之后甚感不爽,例如脏watch,factory,service,provider之类不清晰,然后自己也diy了一把,基于观测者模式,指令,filter重新造另一个轮子,当然这个轮子能否持续下去还要看社会是否会持续火热了