json全称是JavaScript Object Notation。它是基于JavaScript的一种轻量级的数据交换。根据名称就是知道,json最大的用途就是在js程序中用来表示 数据结构,数据对象。
有2种方式来得到json对象。
var json = { name:’’,sex:’’};
第一种就不做说明了。
这种方式,最常用在通过解析从ajax方法返回的字符串,来生成客户端json对象。这些方法网上也是很多,但是还是做个罗列
2.1 eval 法
优点 :简单且对字符串要求不是那么严格
缺点 :会被注入
原生性支持不需要别的模块支持
var json = eval(“(”+jsonStr+”)”);
2.2 jQuery
在jQuery的ajax中,直接可以将数据格式返回成 json
其实前面2种都是调用最后一个方法来解析的。
2.3 json.js
下载json官网提供的解析模块 http://www.json.org/json.js,如下调用,即可解析出json对象
myData = JSON.parse(text, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
return value;
});
第二个参数是,解析每个节点元素后的回调。
上面是从ajax获取字符串后解析生成对象。那么 服务器上是要怎么将对象生成的json字符串呢,比较json是javascript才有的
在asp.net中同样有几种方式来生成.
1.纯手工生成,拼接字符串。
2. net35后,给我们提供了2种方法解析
using System.Runtime.Serialization.Json;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());
using (MemoryStream ms = new MemoryStream()){
serializer.WriteObject(ms, item);
StringBuilder sb = new StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));
return sb.ToString();
}
这个解析方式,没有办法解析匿名类型。如果要解析匿名类型就要使用另外一种
(new System.Web.Script.Serialization.JavaScriptSerializer()).Serialize(new
{
result = i > 0,
message = “”,
bdyzid = “”
});
3.通过一些著名的框架解析 例如Newtonsoft.Json
在.net安装winform程序一般有3种方式 (本文都是基于只有几台服务器,不考虑自动化的情况下进行的)。
每种都有自己的优劣势,和适用的范围。因为工作项目的需求开发了一个winform的小程序运行在2,3台64位win2008的服务器。
所以本文也就只介绍第一种也就是64位VS安装项目的安装包制作过程。以及后续的更新包制作过程。
首先,点击新建项目—>选择[其他项目类型]—>选择[安装和部署]—>选择[Visual Studio Installer]
-->选择([安装项目]或[安装向导]),如下图:
然后,这步就是在 “应用程序文件”,”桌面“等文件夹中添加你的EXE DLL等文件。这里就不细写了。
*你的exe需要编译成64位的,选择winform项目右键属性—>生成—>选择目标平台“x64”
而dll是不需要编译成64位,只要选择成any cpu即可
而后,如果你的exe是64位,但是安装项目还是基于x86的。在生成时就会出现如下的提示
"XX项目的目标平台“x86”不兼容 ",所以这里我们需要将安装项目中的属性修改为基于64位的。需要注意这里的选择属性相当的坑爹。
【属性】,不是指右键项目的属性,如果是你这样选择你将看不到任何关于64位的信息。
先打开这里的属性窗口是[菜单栏—>视图—>属性窗口],点击你的项目。这时候属性窗口中有个targetplatform属性选择为x64位就行了。
这时候再编译就能生成基于64位的安装包了,在64位的服务器下程序也就会按64位的模式运行了。
当你修改了程序,就要涉及程序怎么更新到现场服务器上,我一般用这几种方式
这里说下2,3种类型更新方式
这个方式很简单,就是使用上面那个制作安装包的项目。
步骤也就只有一个步,只要修改下上图中的”Version”和”UpgradeCode”(ProductCode会自动更新),然后重新编译。
使用新生成的安装包,重新安装下就行了。
但是这种方式有种弊端,就是会在 windows的卸载功能中,出现多个 该软件的安装记录如下图
使用winrar可以很方便的制作出一个自解压exe更新包,及环保又绿色只是略微山寨了点
右键选择你需要更新的文件,添加到 rar文件
然后如下图: 关键是选中 【创建自解压格式压缩文件】
同时,还可以设置你程序的安装默认路径, 点击【高级】—>【自解压选项】—>填写解压路径 就是使用exe时的默认路径。
本文并不是javascript教程或是说教类文章,纯粹是个人记录自己工作中使用js的一些心得。
在《javascript权威指南》中说到,js中一切皆为对象。那我们总结下 一共有哪些对象,并且都要怎么定义他们,怎么使用他们,怎么扩展他们。
首先我们需要知道,我们要怎么定义他们。
1.1 现在最火的json对象:用在方便同ajax交互下.
var json = {"name":"hc","sex":"1"};
//使用
alert(json.name+" "+json.sex);
为什么json会这么火呢?因为在我没有接触json前.通过ajax返回数据,解析文本串,是通过”|”来的. 例如:
var strResult = ajax.responseText;
//ajax.responseTex为假设存放ajax返回文本. 1|id=’fffff’|name=’ccc’ 如果我要获取name 我就需要 var attr = strResult.split(‘|' )[2]; 这样既不直观也不面向对象。所以 当我接触了json后。一下就替换到字符串分割的这种做法了.
同时顺带说题外话,json字符串格式要求也比较松散 .上面的 var json={“name”} 的 name,可以使用双引号,单引号,甚至不用引号都可以。但是如果你使用jQuery等外带框架来进行解析的时候,则必须带上双引号。如果你使用最松散的方式来解析的话 var json = eval("(“+str+”)”);//这样要求最小,但是容易被注入。
1.2 最原生的对象 : object
var obj = new Object();
//等价的json申明方式就是
var obj = {};
//所以在各大js框架中,基本上看不到new Object()这种写法,都是 obj = {}的写法;简单明了
1.3 最像类的对象: function
function User(name,sex){
//这样是申明类的属性
this.name=name;
this.sex = sex;
//这样是申明类的公共方法
this.getMyFullName=function(){
return _firstname+this.name;
}
//这个是定义类的私有变量
var _name= name;
var _firstname="黄";
//这个是定义类的私有方法
function getSex(){
}
}
定义好一个类,接下来就是实例他的。和C#一样,通过new 类来实例化他
var my = new User("hc","1");
alert(my.name);
alert(my.getMyFullName());
在各个js框架中基本都是这么几种方式来定义对象。我们知道怎么定义对象后。就需要知道怎么扩展他们。
要扩展对象,无非分为2种 ,一种是扩展整个类,一种就是只扩展某个类的实例化
2.1 prototype 属性
prototype 属性就是javascript用来满足我们扩展整个类 这个需求而产生的。
prototype 定义是 该属性指向当前对象所指向的原型。
光说定义和概念肯定不好理解,打个比方。如果你有需求想要在所有字符串或者数组上加一个方法,你要找谁?
微软才不会给你加个方法。所以这时候 prototype派上用场了.
String.prototype.getTempMethod = function () {
return "hc";
}
var str = "c";
alert(str.getTempMethod());//这样在string中你就拥有的你自己的专属方法
2.2 私有扩展
如果你只想你当前对象扩展一个方法,那么非常的简单,因为在js中所有方法,字段都是属性。即使是不存在属性方法也可以直接使用
只是它的值为undefined
//这时候alert的方法是undefined
var obj = {};
//这时候就在这个对象上定义了一个alert方法了
obj.alert = function(){{
}
这4个属性(以及这几个衍生的属性)几乎所有HTML动画都和这几个属性或者与有关。
我们先列出这些属性和这样相关的属性
width height top left 相关属性 position
offset系列
offsetWidth offsetHeight offsetTop offsetLeft 相关属性 offsetParent
scroll 系列
scrollWidth scrolltHeight scrollTop scrollLeft
client 系列
clientWidth clientHeight clientTop clientLeft
style.width : 在没有显示设置width的时候,这个值是等于””并没有办法获取到实际的宽度
style.height: 同width,没有显式设置时是空的。
那为什么还要有这2个属性,关键在于他们是 可读写的.下面几个属性都是 只读的.
offsetWidth : dom元素的实际宽度,但是没有显示的部分(需要滚动条滚动后显示的部分)
如果元素的display不为“none”的话,使用这个属性就行
offsetHeight: dom元素的实际高度,包含没有显示的部分(需要滚动条滚动后显示的部分)
如果元素的display不为“none”的话,使用这个属性就行
scorllWidth : dom元素的全部宽度,包含没有显示的部分
scrolltHeight : dom元素的高度
IE9下是只表示 显示的高度+上下2个滚动条的高度
chrome 下表是 实际内部的高度。
clientHeight: 可视区域高度
:如果元素的 display为不可见话的.可以先把该元素的 设置为可见,然后通过使用该属性获取 高度
最后再将元素设置为原来的属性即可。
clientWidth : 可视区域宽度
top : 距离上级元素的x距离
left :距离上级元素的y距离
如果要元素实际的top 必须要通过offsetTop来计算,left也是同样要通过offsetLeft来计算
最经典的计算位置代码 (Top)同这个一样
function getLeft(elem){
return elem.offsetParent?
elem.offsetLeft+getLeft(elem.offsetParent):
elem.offsetLeft;
}
下图是网上找到IE6下的各个属性的代表。FF和chrome有可能不同。
因为公司使用Team Foundation Server来管理源代码但有时候需要一些小功能但是VS2010并未提供所以只能通过二次开发来实现一些特定的功能。本文就是通过介绍通过调用TFS2010API来进行一些简单的二次开发。
VS2010+TFS2010SDK(在安装TFS2010时自动就注册成全局的Assembly)
在项目中添加引用 TFS2010的SDK,在项目上右键添加引用—>.Net 选项卡—>添加以下3个引用
Microsoft.TeamFoundation
Microsoft.TeamFoundation.Client
Microsoft.TeamFoundation.VersionControl.Client如果在添加引用时未发现这3个选择项,很有可能是该 项目属性中—>目标框架 不是.NET Framework 4。
其实如果没有装TFS2010或者.net 4.0的只是添加引用对应版本的TFS SDK即可,例如.net可以选择安装D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies\ 下的对应dll即可。
二次开发操作就如同在VS中一样需要先登录后才能进行各种操作例如 获取签出文件,签入,获取最新版本等等。
登录的SDK非常简单。
// 端口号一般默认都是8080 string tfsName = "http://***.***.***.***:8080"; Microsoft.TeamFoundation.Client.TeamFoundationServer tfs =new Microsoft.TeamFoundation.Client.TeamFoundationServer(tfsName, new System.Net.NetworkCredential(“用户名", "密码", tfsName)
);
由于TFS包含了BUG管理,报表,源代码管理等各种功能,所以在SDK中则各种功能体现在对应名称的DLL和类中。首先想要使用源代码管理功能,则需要先从刚才定义变量中获取源代码管理服务。代码如下
VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
获取源代码管理功能后,我们调用
ItemSpec[] itemSpecs = new ItemSpec[1];
itemSpecs[0] = new ItemSpec(@"$/{这里包含TFS根目录下的根路径}/",RecursionType.Full);
PendingSet[] pendingSet =versionControl.QueryPendingSets(itemSpecs,"工作区名称",
"用户名",true);
到这里我们就能获取到,你所指定的用户所在工作区中所有签出的文件。
根据变更集获取文件,同获取签出项时的操作几乎一样,这里就不一一说明了
首先,登录TFS
其次,获取源代码管理功能
然后调用
Changeset s = versionControl.GetChangeset(num, includeDownloadInfo, includeDownloadInfo);
即可获取,指定变更集中所有的文件,只有TFS路径,病人你签入时的本地路径。
首先,登录TFS
其次,获取源代码管理功能
然后,获取要获取路径的所在工作区
Microsoft.TeamFoundation.VersionControl.Client.Workspace ws = versionControl.GetWorkspace("工作区名称", versionControl.AuthenticatedUser);
//最后,调用下载文件函数进行下载
Item item = versionControl.GetItem("$/CRDS3/ClassReflection.cs");
item.DownloadFile(ws.GetLocalItemForServerItem(item.ServerItem));
由于DownloadFile相当的坑爹即使是下载失败,也不会抛出任何异常。所以建议在下载后,加上检测文件最后修改,或者判断文件是否生成来确定是否下载成功过。
TFS二次开发可以说没有什么技术难度,唯一难度就是资料太少了我们无法得知该调用什么API来进行对应的操作。
以下是在进行这次二次开发时,主要的代码参考来源
http://blogs.microsoft.co.il/blogs/shair/archive/tags/TFS+API/default.aspx
最后付上源代码,使用时把TFSHandlercs.cs文件中GetTFSConfig()函数中的一些初始参数修改成你自己的对应的参数。