[Json]将List对象列表转换成JSON格式的类

mikel阅读(835)

转载:http://www.cnblogs.com/pcode/archive/2008/11/26/1341607.html

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。引用于[http://www.json.org/json-zh.html]

一般应用中,我习惯性地把结果集以更通用的IList<object>对象列表方式保存(可能会对性能有些影响)来保证类间交互时的通用性,降低函数功能对具体类的耦合。但AJAX调用时,还需要把对象列表转换成JSON数据交给前端显示。有麻烦。

     研究了一下JSON的对象定义和集合定义

 

     感觉利用反射来生成JSON还比较方便。代码如下:

 

Code

 OK,我们建立一个测试来验证一下它是否生效。

先建立一个对象定义person.cs

Code

然后建立测试类

我用了一种非常原始的方法生成了对象列表,其实可以从数据库查询,怕把事情搞得太复杂。呵呵。

Code

跑一下Nuint,我们想要的json串已经生成了。

[C#]项目管理实践【四】Bug跟踪管理【Bug Trace and Management】

mikel阅读(1846)

首先,向大家说一声抱歉,这篇文章耽误了这么久才和大家见面。
至于Bug的跟踪和管理的必要性和好处,我就不在这里说了,下面介绍几款Bug跟踪和管理的软件。

一、BugNET

BugNET是一个非常优秀的开源软件,基于.NET Framework2.0 ,使用ASP.NET+SQL Server开发的网站项目, 另外项目中还使用了Microsoft Report Viewer Redistributable 2005Microsoft ASP.NET AJAX 1.0。

最新版本是:BugNET 0.7.921.0

官方主页:http://bugnetproject.com/

最新版本下载:http://downloads.sourceforge.net/bugnet/BugNET-0.7.921-Install.zip

源代码下载:http://downloads.sourceforge.net/bugnet/BugNET-0.7.921-Source.zip

英文文档:http://bugnetproject.com/Documentation/tabid/57/topic/Installation/Default.aspx

它具有发送邮件、生成报表、项目配置管理、人员及权限管理、Bug管理等等功能。下面简单说一下它的安装和配置:

 1.解压缩最新的BugNET安装包到一个指定目录中(比如 C:\BugNET)。如果需要源代码,请到这里下载。

 2.确保你已经在你机器的IIS上为BugNET创建一个虚拟目录,指向你第一步中解压出来的文件所在的文件夹(比如:C:\BugNET)。那么URL就应该是http://localhost/BugNet

 3.使用Windows资源管理器,打开网站的根目录(默认是C:\BugNET)。右键点击该目录,在弹出菜单中选择"共享和安全"(请注意: 如果你是有的是Windows XP,在查看这些选项之前,你可能需要启用"简单文件共享")。选择"安全"选项卡。添加合适的用户帐户并设置权限。

如果你使用的是Windows2000-IIS5
– 用户帐户{Server}\ASPNET 必须具有BugNET对应的虚拟目录的读、写和修改权限
如果你使用的是Windows2003 – IIS6
– 用户帐户 NT AUTHORITY\NETWORK SERVICE必须具有BugNET对应的虚拟目录的读、写和修改权限

 4. 在你的SQL Server上创建一个空的数据库(例如数据库名称是'BugNET')。如果是升级操作,那么在做任何操作之前,请备份你的数据库。

5.使用文本编辑器编辑Web.config文件。找到"LocalSQLServer"连接字符串设置,并修改"connectionString"属性值和你在第四步中创建的数据库一致。

<connectionstrings>
</clear>
<add name="LocalSQLServer"
connectionstring="server=MyServer;database=BugNet;uid=BugNet;pwd=BugNet"
providername="" />
</connectionstrings>

6.浏览http://localhost/BugNet/Install/Install.aspx (或者你在第二步中创建的虚拟目录)。

7.安装进程开始。

8.安装完成后,你就可以使用admin用户帐户登录了。

用户名:admin
密码:password

这样,你的BugNET安装完成了,应该可以在http://localhost/BugNet 访问,如果有什么安装问题,请访问支持论坛

下面是运行后,BugNET首页的截图:

我想看完这篇文章,你一定会自己试一试吧!

OK, That's all what I say , and now, it's your turn.

不好意思,由于下面的二款软件不太熟悉,而且由于最近压力比较大,实在也抽不出时间,所以找了一些相关的资料给大家参考,请大家见谅!

二、BugFree

BugFree是借鉴微软公司 软件研发理念、免费且开放源代码、基于Web的精简版缺陷管理系统。它是目前唯一"克隆"微软内部Bug管理工具 Product Stuido(以前叫Raid)的自由软件。BugFree是用PHP+MySQL写,在Linux和Windows平台上都可以运行,我们推荐的使用环 境是LAMP(Linux+Apache+MySQL+PHP)。

下面是是园子里的一些资源,由于同类的资源较多,只选取了较新的几篇。

Bugfree使用点滴。

http://www.cnblogs.com/idragonet/archive/2008/06/04/1213357.html

[原创]如何在Windows下安装Bugfree2.0.0.1

http://www.cnblogs.com/mayingbao/archive/2008/09/09/1287523.html

缺陷管理工具bugfree安装说明

http://www.cnblogs.com/etian/archive/2008/06/05/1214588.html

 

三、Trac+Apache+SVN

Trac 是一个为软件开发项目需要而集成了Wiki和问题跟踪管理系统的应用平台,是一个开源软件应用。 Trac 以简单的方式建立了一个软件项目管理的Web应用,以帮助开发人员更好地写出高质量的软件; Trac 应用力求不影响现有团队的开发过程。

Trac功能:

Wiki:这个就不用说了吧
Timeline: 可以看看最近有哪些文件被更新, 可以快速跟上进度
Roadmap:项目进度包括那些阶段, 可以看目前进度状况,依照 Ticket的设定, Ticket 可以指向某个 Milestone, 已便追踪目前项目的完成进度.
Browse Source: 和SVN集成后,可以查看源代码及SVN的代码提交日志
View Tickets: 看目前有哪些Ticket, 看哪些沒有完成(常用: My Tickets, Active Tickets) 等等
          Tickets包含下面的类型:

  1. Active Tickets – 目前有哪些 Tickets 是 Active 的
  2. Active Tickets by Version
  3. Active Tickets by Milestone – 靠 Milestone 划分 Active Tickets
  4. Assigned, Active Tickets by Owner
  5. Assigned, Active Tickets by Owner (Full Description)
  6. All Tickets By Milestone (Including closed) – 列出所有 Tickets
  7. My Tickets – 列出属于自己的 Tickets
  8. Active Tickets, Mine first – 列出所有 Active Tickets, 依照重要性排列

New Ticket:添加一个新的Ticket,即一个可能的Bug条目。
Search:搜索功能

下面是园子里的一些文章,大家如果有兴趣,也可以到网上找到很多类似的文章。

Trac 手记(一) : Windows 下安装 Trac

http://www.cnblogs.com/zealic/archive/2007/12/29/1019837.html

win32上安装Apache+SVN+Trac笔记

http://www.cnblogs.com/nobel1984/archive/2008/11/03/1325772.html

您可以查看这个系列的全部文章:项目管理实践入门系列教程


作者:ttzhangTechnology Life–张涛的技术博客
出处:http://ttzhang.cnblogs.com/
本文版权由作者全部保留,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Tag

[网站]FileRide——与众不同的社交网站

mikel阅读(807)

FileRide是一个很别致的社交网 站,总部位于斯德哥尔摩:该网站围绕你电脑上的文件,为你打造一个社交网络。比如说,可以让你知道在该网站上,哪个用户的电脑上有你喜欢的音乐和图片,你 可以把它们加为好友。你还可以就这些文件进行评论和即时交流。但是你不能通过该网站传送文件。目前该网站客户端支持XP和Vista,OSX和手机版正在 开发中。

围绕文件做文章

和基于现有关系网的其他网站不同,FileRide更加关注共同爱好。你不用再去寻找知音,你收藏的音乐和youtube视频就可以帮你打造一个关系网。

当你复制或者粘贴文件、图片或者链接时,FileRide桌面程序就会通知你是否将其加入FileRide。你还可以直接拖拽文件到FileRide。

FileRide会给图片和音乐制作“数字手印”,重命名之后也可以识别。

此外FileRide还包括微博客、类似Facebook的应用,朋友和小组的订阅种子,桌面消息提醒等。

FileRide很快就可以识别ISBN和其它格式文件了。

11月30日之前注册

如果你想使用,最好在11月30日之前,之后将改为邀请注册。

结论

总的来说该网站还不错,很多地方需要改进,但是正在高速增长,主要靠口碑传播。

[AJAX]Ajax与iframe

mikel阅读(808)

转载:http://www.cnblogs.com/blacktear23/archive/2008/11/26/1341408.html
  Ajax
已经如日中天,很多Ajax的框架让我们已经能轻松享受Ajax技术的美妙。不过Ajax也有美中不足。如果我们使用JQuery的话,用Ajax进行一个异步的调用,我们会发现一个小问题,如果请求一个以GB2312编码的页面,更新后的结果就会是乱码。无论是在FF还是在IE上都是如此:

1 <script>
2 $.get(“URL”, function(data) {
3        $(“#content”).html(data);
4 });
5 </script>
6 <div id=”content” />

 

    其原因在于JQueryAjax只支持UTF-8编码。当我们传入GB2312编码时,在解码的过程中会出现问题。不过这对于动态页面来说,非常容易解决,在输出页面内容时转换成UTF-8编码即可。不过如果请求的是一个静态页面,或者是别人的页面,那么我们就没有太好的办法来使用Ajax了。

    不过iframe倒是一个比较好的替代品,有经验的开发者都了解,把iframesrc属性指向另外一个URL就可以改变其中的内容,而且对编码并不敏感。但仍旧有一个问题就是iframe不能自动跟随内容的多少来调整其大小。

    在网上搜“iframe 自适应”可以搜到很多自动调整iframe大小来适应内容量的JavaScript代码。不过这些代码或多或少有一些跨浏览器问题。在IE上,基本上都是可行的。而在FF上有些代码就失去了效力了:

 1 function ResizeIFrame (id){
 2        var iframe=document.getElementById(id); //iframe id
 3        if (document.getElementById){
 4               if (iframe && !window.opera){
 5                      if (iframe.contentDocument && iframe.contentDocument.body.scrollHeight){
 6                             iframe.height = iframe.contentDocument.body.scrollHeight;
 7                      }else if(iframe.Document && iframe.Document.body.scrollHeight){
 8                             iframe.height = iframe.Document.body.scrollHeight;
 9                      }
10               }
11        }
12 }

 

    上面这段代码在IE上是没有问题的,而在FF3上就会出现问题:scrollHeight经常返回0,似乎FF3并不对iframe的内容计算其实际高度。不过如果你的用户只用IE,那么将就一下也算可以。如果你想做得更完美一些的话,这种“自适应”方法却有问题。

    不过从上面的代码中,我们可以发现一点:既然可以得到iframe内容的body对象,就可以得到bodyinnerHTML!这样我们可以再加入一个div或者span标签,把body对象的innerHTML复制到divinnerHTML中。利用div的高度自适应,加上iframe的异步请求和编码不敏感的特性,就可以达到一个很好的效果。

JavaScript代码:

 1 function LoadContent(src, iframeID) {
 2        var content = document.getElementById(iframeID);
 3        content.setAttribute('src', src);
 4 }
 5  
 6 function swipContent(src, to) {
 7        document.getElementById(to).innerHTML = getIFrameContent(src);
 8 }
 9  
10 function getIFrameContent(id){
11        var bobo=document.getElementById(id); //iframe id
12        if (document.getElementById){
13               if (bobo && !window.opera){
14                      if (bobo.contentDocument){
15                             return bobo.contentDocument.body.innerHTML;
16                      }else if(bobo.Document){
17                             return bobo.Document.body.innerHTML;
18                      }
19               }
20        }
21 }

 

HTML的代码:

1 <href=”#” onclick=”LoadContent(‘URL’, ‘icontent’)”>Link Button</a>
2 <iframe id=”icontent” width="600" height="0" scrolling="auto" frameborder="0"
3     onload="swipContent('icontent', 'dest')"></iframe>
4 <div id=”dest” />

    随着UTF-8编码的逐渐流行,这种“绕圈子”的方法的用武之地就逐渐变少了。而随着找到解决方法的这一连串的过程至少给了我一个启示:有时候换个思路就好多了。如果在寻找iframe的高度自适应功能上,仅仅只盯住scrollHeight就会花费更多的时间而且找不到好的办法。而跳出iframe,换一种思路:把iframe当作一个Ajax引擎来实现异步调用的功能,就是另一片天地了。

    在最后,也顺便说说,这种方法的问题:如果在iframe请求的页面中使用了主页面中未定义的CSS样式,那么上面这个移花接木的方法就会出现显示问题。至于解决方法,就是把iframe中的页面的CSS导入到主页面中。

[3D]Ha, I Can Touch The Ball Anywhere

mikel阅读(709)

转载:http://www.cnblogs.com/skyman/archive/2008/11/25/ik.html

   角色动画是构建虚拟世界(游戏和虚拟社区)一个比较重要的内容。因为虚拟世界最关键的是人与虚拟角色(即“化身”,Avatar)之间的交互,会动的世界才有生机。角色动画可分两种:预定义动画(predefined animation)和程序动画(procedural animation)。预定义动画是事先由美术师制作好的动画序列,程序运行时只能播放,不能改变;程序动画是在程序运行时实时生成。相比预定义动画,程序动画能实现更好的交互。
    程序动画可以用来实现物理动画(physics animation),物理动画可以让角色根据物理规律对外界作出相应的反应动作。物理动画现在已经开始应用到3D游戏里了。比如Crytek公司的CRYENGINE 2引擎就采用了这项技术,例如角色可以根据地形的坡度来自动调整站立的身姿,如下图所示:

    IK就是一种实现程序动画的方法。骨络动画分为FK(正向运动学,Forward Kinematics)和IK(逆向运动学, Inverse Kinematics)两种。FK这里就不细讲了,是最常用的设置动画的方法。这里主要讲一下IK,IK和FK相反,它是给定末端作用器的位置或方向,来反求各节点的位置。如下图所示:

    IK主要用于程序动画中,比如跑步时人的腿根据地形进行自适应,用手拿东西,用手握扶手开门等。如下图所示:


    IK计算有2种方法:解析法和迭代法。解析法速度快,但只适用于节点较少的情况;迭代法通用性强,但有时容易得到局部极小值。所以一般是这两种方法混用。IK的解的个数有多种情况:

                 

          (a) 无解                                  (b) 唯一解                      (c) 两个解                               (d) 许多解

    若节点数大于2个,就会出现有许多解的情况,那么如何选择最佳解呢,对人的手和腿来说,每个关键都有约束(转动角度的范围),那么就要考虑这些解有没有满 足这些约束。但是可能满足这些约束的解不止一个,这时就要选择一个最佳的,比如视觉效果最好的。一种方法是选择消耗能量最少的那个(比如手臂各关节抬得最 低)。
    FK可以实现比较自然的动画效果;IK可以用在程序中实时生成骨络的关键帧,这样就可以使角色根据外界环境实时的作出动作的反应,更真实。因为FK和IK各有优缺点,所以往往FK和IK混用(FK/IK blend)。

    上面说到IK能够更好的实现交互效果。比如在虚拟世界(游戏或虚拟社区)中,你可以让一个角色替你拿某样东西,等等,IK就能实现这种需求,这样会使我们 和虚拟角色的交互更加有趣。下面是我最近做的一个小demo,演示的就是你把红色小球放在某一个地方,虚拟角色都可以用手摸到它。技术要点主要是:实时 IK求解器和FK/IK混合。

高清版观看地址:http://www.youtube.com/watch?v=1cVD1zXcSz8&fmt=18

[Flash]Adobe 发布 Alchemy:编译C/C++代码为Flash

mikel阅读(879)

SnT2K 说道:Adobe最近发布了 Alchemy beta版本,Alchemy 能够编译C/C++代码为AS3字节码(运行在AVM2上)能够运行在Flash或者Flex平台,并且Adobe宣传Alchemy能够为计算密集型任 务提升性能(但是比原生C/C++慢),去年Adobe曾经在芝加哥AdobeMAX2007大会上通过演示Quake(雷神之锤)游戏来验证。几个月 后,Adobe又通过运行 Python解析器 和 任天堂模拟器 做了演示证明。比较有趣的一点是Alchemy是在开源 LLVM 编译架构 的基础上创建的。
详情访问:http://labs.adobe.com/technologies/alchemy/

[Google]谷歌(Google)中国推出手机软件包

mikel阅读(965)

谷歌移动搜索已经可以实现网页、地图、图片、资讯、财经、字典等手机搜索服务。现在,谷歌中国将这些移动搜索服务集成为一个“谷歌手机软件包”。通 过它,用手机上网搜索也可以像在台式机上一样的方便快捷。目前,这款新软件还只适用于采用Nokia Symbian S60平台的手机。面向更多手机平台的谷歌手机软件包(GMA)不久将与中国用户见面。

界面风格类似谷歌中国主页 集中展示谷歌搜索服务

     谷 歌中国主页(www.g.cn)一以贯之的简单直率的风格你喜欢吗?还有列在谷歌搜索框下面的跟随鼠标跃动的代表视频搜索、图片搜索、生活搜索等服务的八 个彩色动画图标?现在,只要下载一个谷歌手机软件包(Google Mobile App),你的手机屏幕也能实现同样的简洁生动的界面。

  谷歌手机软件包(GMA)可以在谷歌移动搜索页面(mobile.google.cn)下载,安装了这个软件包,你就可以在手机的待机画面上直接点击快捷键,进入一个与谷歌中国主页相似的简洁界面,立即开始使用谷歌搜索了。

  点击谷歌手机软件的快捷键之后,界面将变为:简单的网页搜索框,加上五个彩色动画图标,分别代表谷歌地图、谷歌图片、谷歌资讯、谷歌财经、谷歌词典的移动搜索服务。点击图标可以带你快速进入相关查询服务。


降低移动搜索平均耗时 带来方便快捷搜索体验

   手机用户使用搜索时,面临着浏览器启动不便、网络连接不畅、查询词输入慢等诸多困难。在使用谷歌手机软件包之后,这些繁琐的过程都由一个快捷键所代替。 只需在待机画面上点击快捷键,就可以直接输入查询词。当你输入搜索词时,谷歌手机软件还会根据你过去的搜索历史记录给出搜索建议(用户也可以选择不记录搜 索历史),并帮助用户完成搜索词。我们相信这可以大大缩短用户在手机上输入的时间。谷歌的实验结果表明,这种新的方式可以将一个移动搜索的平均耗费时间降 低一半以上。

  有了这个软件包,用户只需点击就可以在图片搜索、资讯搜索、财经搜索等不同搜索服务之间快捷切换。通过它,你还可以快捷地启动谷歌手机地图,获得实时交通状况、周边餐饮及生活信息、公交及驾车路线等诸多功能。


   谷歌中国开发这一软件包的目的是给你带来全新的方便快捷的搜索体验。谷歌中国开发的谷歌手机软件包(GMA)可供用户完全免费自由下载。目前这款谷歌手 机软件包(GMA)还只适用于采用Nokia SymbianS60平台的手机。面向更多手机平台的谷歌手机软件包(GMA)不久将与中国用户见面。

[MVC]Asp.Net MVC:基于cookie的用户自选视图引擎实现

mikel阅读(741)

转载:http://www.cnblogs.com/leven/archive/2008/11/25/aspnetmvc_selectviewengine.html

在 我以前的文章中详细介绍了目前mvc框架中的视图引擎管理,这个视图引擎可以方便的实现系统多视图引擎的管理,让系统可以轻松更好视图引擎,但是,在一些 应用,比如bbs,多用户blog中,往往需要提供用户自选skin的功能,比如bbs中某个用户通过菜单可以随意更换自己的skin设置,而mvc框架 的默认视图管理器对这个要求就无法做到了,而本文则是使用viewengine规则来实现一个用户自选视图引擎的功能.

在本系统中,用户选择的skin信息将保存在cookie中,这意味着可以让用户控制这个选择保存的时间.

首 先,这个系统仍然是基于ViewEngine,我们在以前的文章中可以看到,mvc框架用一个AutoViewEngine来管理存在的所有 ViewEngine,那么我们也可以考虑用一个SelectViewEngine来管理一系列我们特定的可选择ViewEngine.下面先看看这个核 心部分的类:

 

从图中可以看到,这儿我们提供了一个新的接口ISelectViewEngine,它在普通的ViewEngine上添加了一个新的Name属性,该属性标示着唯一的视图引擎名称,然后我们对WebFormViewEngine进行封装,并实现ISelectViewEngine接口:

Code

 

从上面的代码可以看到,默认的不同skin分别放在~/skins目录下,不同的SelectWebFormViewEngine对应不同的子目录.

然后我们实现一个基本的SelectViewEngine来管理所有的可选择ViewEngine,关键代码如下:

 

Code


那么我们如何确定用户选择了哪个ViewEngine呢?在本例中是采用了cookie的方式,在ViewEngineExtension中,我们封装了几个扩展方法用来获取cookie和设置cookie:

 

Code

 

总结下VIewEngine的工作流程:

Controller -> ViewEngines.Default.FindView -> SelectViewEngine.FindView -> SelectWebFormViewEngine.FindView

也就是说,系统调用FindView或者FindPartialView方法最终还是会调用到我们在系统中已经注册过的ISelectViewEngine的FindView或者FindPartialView方法.最后展示下如何注册这些SelectViewEngine:

 

Code

 

到此,所有功能实现
实例工程代码:

/Files/leven/LevenViewEngine.rar
Leven

[C#]Net 3.5 用DataContractJsonSerializer实现Json序列和反序

mikel阅读(771)

近来在研究JQuery,用$.ajax在与后台交换数据时用到Json格式,后台与前台序列化和反序列化方法研究了很久才成功,发文共享.

前台调用的JS文件需要用到JQuery-1.2.6.jsjson2.js,后台引用空间System.Runtime.SerializationSystem.Runtime.Serialization.Json

Json序列化和反序列化方法

        /// <summary>
        
/// Json序列化,用于发送到客户端
        
/// </summary>
        public static string ToJsJson(this object item)
        {
            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();
            }
        }
        
/// <summary>
        
/// Json反序列化,用于接收客户端Json后生成对应的对象
        
/// </summary>
        public static T FromJsonTo<T>(this string jsonString)
        {
            DataContractJsonSerializer ser 
= new DataContractJsonSerializer(typeof(T));
            MemoryStream ms 
= new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T jsonObject 
= (T)ser.ReadObject(ms);
            ms.Close();
            
return jsonObject;
        }

实体类

    [DataContract]
    
public class TestObj
    {
        [DataMember]
        
public string make { getset; }
        [DataMember]
        
public string model { getset; }
        [DataMember]
        
public int year { getset; }
        [DataMember]
        
public string color { getset; }
    }

——————————————–JavaScript获取Json————————————————–

JavaScript调用测试代码

$('#getJson').click(function() {
                $.ajax({
                    url: 
"getJsonHandler.ashx",
                    type: 
'GET',
                    data: {},
                    dataType: 
'json',
                    timeout: 
1000,
                    error: 
function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
                    success: 
function(result) {
                        alert(result.make);
                        alert(result.model);
                        alert(result.year);
                        alert(result.color);
                    }
                });
            });

C#后台生成代码

public class getJsonHandler: IHttpHandler
    {
public void ProcessRequest(HttpContext context)
        {
            TestObj obj 
= new TestObj();
            obj.make 
= "Make is Value";
            obj.model 
= "Model is Value";
            obj.year 
= 999;
            obj.color 
= "Color is Value";
            context.Response.Write(obj.ToJsJson());
        }
 
public bool IsReusable
        {
            
get
            {
                
return false;
            }
        }
}
//返回值为 {"color":"Color is Value","make":"Make is Value","model":"Model is Value","year":999}

 ——————————————C#由Json生成对象—————————————————

JavaScript调用测试代码

           $('#postJson').click(function() {
                
var m_obj = { make: "Dodge", model: "Coronet R/T", year: 1968, color: "yellow" };
                
var jsonStr = JSON.stringify(m_obj); //用Json2.js生成Json字符串

                $.ajax({
                    url: 
"postJsonHandler.ashx",
                    type: 
'POST',
                    data: { postjson: jsonStr },
                    dataType: 
'json',
                    timeout: 
1000,
                    error: 
function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
                    success: 
function(result) {
                        alert(result.success);
                    }
                });
});

C#后台生成代码

public class postJsonHandler: IHttpHandler
    {
        
public void ProcessRequest(HttpContext context)
        {
            
string jsonStr = context.Request["postjson"];
            TestObj obj 
= jsonStr.FromJsonTo<TestObj>();
            
if (string.IsNullOrEmpty(obj.make) || string.IsNullOrEmpty(obj.model) || string.IsNullOrEmpty(obj.color) 
|| obj.year < 0)
            {
                context.Response.Write(
"{success:false}");
            }
            
else
            {
                context.Response.Write(
"{success:true}");
            }
public bool IsReusable
        {
            
get
            {
                
return false;
            }
        }
}

 

使用Json时需要注意,服务器端拼凑生成Json字符串时,一定要注意把字符串用\"\"包裹,不然客户端接收时肯定会报错,根据Json字符串生成对象,是根据对应的名称赋值,多于或少于都不会报错.PS:小学语文没学好,让各位见笑.

[C#]ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现)

mikel阅读(942)

转载:http://www.cnblogs.com/aierong/archive/2008/11/25/culture.html

最近给单位做了一个业务下单系统,由于在全球几个国家都有业务办事处,所以下单系统做的是多语言界面的
我实现多语言是利用了ASP.NET2.0的资源文件,其实据我所知除了资源文件的方式,在数据库里面建多个表中进行一个区域文化映射,也是解决国际化的一种方式(关于这种方式感兴趣的朋友可以自己试试)
现在我把实现国际化用到的相关知识总结如下:

在总结全球化知识前,先来了解一个名词:表达式语法
表达式语法格式:<%$ … %>
它是ASP.NET2.0新增了一种声明性表达式语法,可在分析页之前将值替换到页中.
ASP.NET表达式是基于运行时计算的信息设置控件属性的一种声明性方式.
ASP.NET表达式主要应用在:连接字符串,应用程序设置,资源文件等地方.

ASP.NET 表达式的基本语法如下:
<%$ expressionPrefix: expressionValue %>

下面演示表达式语法在连接字符串和应用程序设置的应用:

a.表达式语法在连接字符串的应用
将存储在Web.config文件中的连接字符串的值设置为控件的连接字符串属性
<asp:SQLDataSource ID="SQLDataSource1" Runat="server"
    SelectCommand="Select * FROM Employees"
    ConnectionString="<%$ ConnectionStrings:NorthwindCon %>">
</asp:SqlDataSource>

<configuration>
  <connectionStrings>
    <add name="NorthwindCon"
      connectionString="Data Source=yanfa0;Integrated Security=SSPI;Initial Ctalog=Northwind;"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

b.表达式语法在应用程序设置的应用
使用表达式来引用在Web.config配置文件中定义的应用程序设置
<asp:Label ID="Label1" runat="server" Text="<%$ AppSettings:Txt %>"></asp:Label>

<appSettings>
 <add key="Txt" value="Abc"/>
</appSettings>

其实表达式语法还有一个重要的应用,就是在资源文件中的使用,而资源文件正是我实现本地化的基础.

ASP.NET2.0提供了三项关于网站国际化的特性:
(1)自动侦测浏览器的语言
通过确定发出请求的浏览器的语言,可以方便地根据用户的区域性调整应用程序的行为
(2)声明本地化的表达式
声明性资源表达式可使您的应用程序使用多种语言,而不必手动编写代码来检索资源并在页中进行替换
只需使用ASP.NET2.0中新提供的表达式语法即可对资源替换进行定义
(3)生成本地资源
ASP.NET2.0支持标准的resx文件格式自动进行运行时资源检索。
Vs2005也提供了相应的支持,可方便地生成资源

 

A.区域性的格式设置
区域性名称和标识符名称遵循RFC 1766标准,具体请查看msdn
请看下图,我抓取的部分区域性图片:

区域性通常分为三个类型:固定区域性、非特定区域性和特定区域性。
a.固定区域性不区分区域性。可以使用空字符串("")或者按区域性标识符0x007F来指定固定区域性,它与英语语言关联,但不与任何国家/地区关联。
b.非特定区域性是与某种语言关联但不与国家/地区关联的区域性。
c.特定区域性是与某种语言和某个国家/地区关联的区域性。
例如:"fr"(法语)是非特定区域性,而"fr-FR"(法语(法国))是特定区域性
特别提示:"zh-CHS"(简体中文)和"zh-CHT"(繁体中文)是非特定区域性。

区域性是有层次结构的,即特定区域性的父级是非特定区域性,而非特定区域性的父级是InvariantCulture

利用ASP.NET2.0可轻松地逐页更改区域性设置
只需将UICulture和Culture(区域性)属性添加到.aspx等类似页面内的Page指令即可
<%@ Page  Culture="Auto" UICulture="Auto" %>

要想对站点中的所有页面都设置相同的区域性设置,只需将以下元素添加到位于站点的根处的web.config文件中即可,这样就不必分别为每个页面进行分配了
<globalization uiCulture="auto" culture="auto" />

还可以为ASP.NET指定一个默认区域性
以下指定页面的用户界面区域性是自动,默认区域性是英语,页的区域性是自动,默认区域性是英语(美国)
<globalization uiCulture="auto:en" culture="auto:en-US" />

Culture:指示页的区域性设置
UICulture:指定用于页的用户界面(UI)区域性设置

关于Internet Explorer中设置首选语言,可以如下配置:
1.选择“工具 | Internet 选项”命令。
2.选择“语言”按钮。
3.在显示的对话框中,单击“添加”按钮添加一个新的语言并选择一个新的区域性。单击“确定”。
4.请确保首选语言位于列表的顶部。选择该语言并单击“上移”。单击“确定”退出对话框。
5.刷新。

 

B.设置语言首选项
自动检测功能所选择的默认Culture和UICulture有时可能不是用户所需要的
例如:一个美国籍业务员来到中国出差,在中国总部上网下业务单.这种情况下,Web应用程序应该为用户提供显式更改语言的功能,给他提供英文版的业务下单页

using System.Threading;
using System.Globalization;

protected override void InitializeCulture ( )
{
    //显式的指定区域为en,为美国籍业务员显示英文页
    //实际应用中可以根据用户选择来动态设置语言
    //还可以利用Profile来记住用户选择的语言,以便用户以后访问网站时自动进入相应语言页
    Thread.CurrentThread.CurrentUICulture = new  CultureInfo ( "en" );
    Thread.CurrentThread.CurrentCulture =  CultureInfo.CreateSpecificCulture ( "en-US" );
}

注意:对Thread.CurrentThread.CurrentCulture和 Thread.CurrentThread.CurrentUICulture所做的更改需要在InitializeCulture()方法中进行,因为 对首选浏览器语言的自动检测是在页生存期的早期发生的

特别提示:
CultureInfo类的实例化一般有两个途径,如下所示:
CultureInfo culture = CultureInfo. CreateSpecificCulture (name);
CultureInfo culture = new CultureInfo(name);
二者的区分:
使用第一种方法,只能创建固定区域性或特定区域性的CultureInfo实例。
使用第二种方法,则是建立一个name所指定的区域性的CultureInfo实例,它可以是固定的,非特定的或特定区域性的

Thread类的CurrentCulture属性用来获取或配置当前线程的区域性,它必须被配置为特定区域性。
假如Thread.CurrentThread.CurrentCulture = new CultureInfo ( "en" );就会报错!

 

C.全局资源和本地资源
资源文件实际是XML文件,其中包含要转换为不同语言或图像路径的字符串。
资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。
ASP.NET中的资源文件具有.resx扩展名。在运行时,.resx 文件将编译进一个程序集内。

全局资源位于一个名为/App_GlobalResources的专用文件夹中,该文件夹位于应用程序的根目录下。
所有页、用户控件等都可访问这些资源,因此全局资源通常用作共享资源。
资源文件的名称用在显式表达式中,但也采用namespace.classname形式,以便在应用程序的Resources命名空间下进行强类型访问。

本地资源在同级/App_LocalResources文件夹下定义,RESX 文件遵循关联页、用户控件或母版页以及区域性定义的命名约定.
例如:与Index.aspx页一起有一个名为App_LocalResources的文件夹,本地资源就放在该文件夹中,该文件夹根据页的名称相应命名如下:
Index.aspx.resx。非区域性特定资源文件
Index.aspx.fr.resx。区域性特定资源文件(法语)
Index.aspx.de.resx。区域性特定资源文件(德语)
文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾

提示:Vs2005可以在设计视图编辑器中打开页、用户控件或母版页时,在工具菜单中提供一个名为生成本地资源的命令。该命令可自动创建默认区域性的本地资源文件。
若要创建其他语言的资源文件,可以在解决方案资源管理器中复制该文件,然后按照以下模式之一重命名它:
对于全局资源文件:
name.language.resx
name.language-culture.resx
对于局部资源文件:
pageOrControlName.extension.language.resx
pageOrControlName.extension.language-culture.resx
例如,如果创建名为WebResources.resx的全局资源文件,且该文件将翻译为英语,则请将复制的文件命名为WebResources.en.resx。请注意,对于局部资源文件,资源文件名是页或控件的名称(包括文件扩展名),后面是语言和区域性信息。

全局资源文件和本地资源文件之间选择?
通常情况下,希望在各页之间共享资源时,应向全局资源文件添加这些资源。
全局资源文件中的资源还是强类型的,用于以编程方式访问。
但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。
此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。
本地资源文件使得单个ASP.NET网页的资源比较容易管理,但不能在各页之间共享资源。
此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。

提示:
在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,ASP.NET都重新编译资源并重新启动ASP.NET应用程序
在添加附属资源文件将不会导致重新编译资源,但ASP.NET应用程序将重新启动

 

D.资源表达式
有两种形式的资源表达式:显式和隐式

(1).本地资源的隐式表达式
如果已为页创建了本地资源文件,则可以使用隐式本地化从该资源文件中为控件填充属性值。
使用隐式本地化时,ASP.NET读取资源文件并将资源与属性值相匹配。
在页上,对该控件的标记使用特殊的 meta 属性可指定隐式本地化.

<asp:Button ID="Button1" runat="server" Text="Button" meta:resourcekey="Button1Resource1" />

resourcekey值与相应资源文件中的键相匹配,如果在资源文件中定义了某个属性值,则ASP.NET会用资源值替换该属性。

(2).本地资源的显式表达式
与隐式本地化不同,必须为要设置的每个属性分别使用一个资源表达式。
该表达式采用以下形式,ResourceID是必需的:
<%$ Resources:  ResourceID %>

<asp:Button ID="Button1" runat="server"
 Text="<%$ Resources: Button1Resource1.Text  %>"
    ToolTip="<%$ Resources:Button1Resource1.ToolTip %>" />
               

(3).全局资源的显式表达式
该表达式采用以下形式:
<%$ Resources: Class , ResourceID %>
Class是全局资源时使用的资源文件,ResourceID是要读取的资源的标识符.

<asp:Button ID="Button1" runat="server"
    Text="<%$ Resources : ResourceGlobal, Button1Txt  %>"
    ToolTip="<%$ Resources : ResourceGlobal, Button1ToolTip  %>" />

 

E.对全局资源和本地资源的编程访问
调用GetLocalResourceObject或GetGlobalResourceObject方法以分别从全局资源文件或本地资源文件中读取特定的资源

//访问本地资源
Button1.Text = GetLocalResourceObject ( "Button1Resource1.Text" ).ToString ( );
Button1.ToolTip = GetLocalResourceObject ( "Button1Resource1.ToolTip" ).ToString ( );
//访问全局资源
Button1.Text = GetGlobalResourceObject ( "ResourceGlobal" , "Button1Txt" ).ToString ( );
Button1.ToolTip = GetGlobalResourceObject ( "ResourceGlobal" , "Button1ToolTip" ).ToString ( );

 

F.编码
对于比较旧的浏览器以及移动设备上的浏览器,可能有必要将与浏览器之间的通信转换成某种基于代码页的旧式编码
在web.config文件的globalization节中配置即可

 

G.代码下载
http://files.cnblogs.com/aierong/WebSite_CultureInfo.rar

 

作者:http://www.cnblogs.com/aierong