自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的重要功能。微信增加了点击菜单后调起扫一扫(支持二维码/一维码)、发图片、发地理位置的能力,需开发实现。原有自定义菜单开发权限的公众号,均可获得以上能力。 在这篇微信公众平台开发教程中,我们将介绍如何在自定义菜单上开发扫一扫、发图片、发地理位置等功能。原有点击和跳转事件的开发,请参考微信公众平台开发(58)自定义菜单。 本文分为以下二个部分: 扫一扫、发图片、发地理位置介绍 生成扫一扫、发图片、发地理位置功能菜单 开发扫一扫、发图片、发地理位置响应程序 使用场景 一、菜单介绍 1. 扫码推送事件 scancode_push 用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后显示扫描结果(如果是URL,将进入URL),且会将扫码的结果传给开发者,开发者可以下发消息。 2. 扫码推送事件,且弹出“消息接收中”提示框 scancode_waitmsg 用户点击按钮后,微信客户端将调起扫一扫工具,完成扫码操作后,将扫码的结果传给开发者,同时收起扫一扫工具,然后弹出“消息接收中”提示框,随后可能会收到开发者下发的消息。 3. 弹出系统拍照发图 pic_sysphoto 用户点击按钮后,微信客户端将调起系统相机,完成拍照操作后,将拍摄的相片发送给开发者,并推送事件给开发者,同时收起系统相机,随后可能会收到开发者下发的消息。 4. 弹出拍照或者相册发图 pic_photo_or_album 用户点击按钮后,微信客户端将弹出选择器供用户选择“拍照”或者“从手机相册选择”。用户选择后即走其他两种流程。 5. 弹出微信相册发图器 pic_weixin 用户点击按钮后,微信客户端将调起微信相册,完成选择操作后,将选择的相片发送给开发者的服务器,并推送事件给开发者,同时收起相册,随后可能会收到开发者下发的消息。 6. 弹出地理位置选择器 location_select 用户点击按钮后,微信客户端将调起地理位置选择工具,完成选择操作后,将选择的地理位置发送给开发者的服务器,同时收起位置选择工具,随后可能会收到开发者下发的消息。 以上新增能力,均仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信用户点击后将没有回应,开发者也不能正常接收到事件推送。 接口调用请求说明 http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN 按钮请求示例如下
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
{ "button": [ { "name": "扫码", "sub_button": [ { "type": "scancode_waitmsg", "name": "扫码带提示", "key": "rselfmenu_0_0", "sub_button": [ ] }, { "type": "scancode_push", "name": "扫码推事件", "key": "rselfmenu_0_1", "sub_button": [ ] } ] }, { "name": "发图", "sub_button": [ { "type": "pic_sysphoto", "name": "系统拍照发图", "key": "rselfmenu_1_0", "sub_button": [ ] }, { "type": "pic_photo_or_album", "name": "拍照或者相册发图", "key": "rselfmenu_1_1", "sub_button": [ ] }, { "type": "pic_weixin", "name": "微信相册发图", "key": "rselfmenu_1_2", "sub_button": [ ] } ] }, { "name": "发送位置", "type": "location_select", "key": "rselfmenu_2_0" } ] } |
参数说明 参数 是否必须 说明 button 是 一级菜单数组,个数应为1~3个 sub_button 否 二级菜单数组,个数应为1~5个 type 是 菜单的响应动作类型 name 是 菜单标题,不超过16个字节,子菜单不超过40个字节 key click等点击类型必须 菜单KEY值,用于消息接口推送,不超过128字节 url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节 二、生成菜单 菜单具体的生成方法,与之前是一样的,先生成access token,再将菜单post内容提交给微信服务器,具体代码及方法可以参考 微信公众平台开发(58)自定义菜单。 生成后的效果如下如示: 三、响应菜单点击 响应菜单点击,则需要在接口文件中添加新的EventKey事件的响应,并回复相应的内容。 相关代码如下
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
//接收事件消息 private function receiveEvent($object) { $content = ""; switch ($object->Event) { case "subscribe": $content = "欢迎关注方倍工作室 "; $content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):""; break; case "unsubscribe": $content = "取消关注"; break; case "CLICK": switch ($object->EventKey) { case "COMPANY": $content = array(); $content[] = array("Title"=>"方倍工作室", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); break; default: $content = "点击菜单:".$object->EventKey; break; } break; case "VIEW": $content = "跳转链接 ".$object->EventKey; break; case "SCAN": $content = "扫描场景 ".$object->EventKey; break; case "LOCATION": $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude; break; case "scancode_waitmsg": $content = "扫码带提示:类型 ".$object->ScanCodeInfo->ScanType." 结果:".$object->ScanCodeInfo->ScanResult; break; case "scancode_push": $content = "扫码推事件"; break; case "pic_sysphoto": $content = "系统拍照"; break; case "pic_weixin": $content = "相册发图:数量 ".$object->SendPicsInfo->Count; break; case "pic_photo_or_album": $content = "拍照或者相册:数量 ".$object->SendPicsInfo->Count; break; case "location_select": $content = "发送位置:标签 ".$object->SendLocationInfo->Label; break; default: $content = "receive a new event: ".$object->Event." \n技术支持 方倍工作室"; break; } if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($object, $content); }else if (isset($content['MusicUrl'])){ $result = $this->transmitMusic($object, $content); } }else{ $result = $this->transmitText($object, $content); } return $result; } |
各项类型推送给后台的xml详解如下 scancode_waitmsg,回应该事件给用户,用户可收到消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075435</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[scancode_waitmsg]]></Event> <EventKey><![CDATA[rselfmenu_0_0]]></EventKey> <ScanCodeInfo> <ScanType><![CDATA[qrcode]]></ScanType> <ScanResult><![CDATA[http://weixin.qq.com/r/pUNnf4HEX9wgrcUc9xa3]]></ScanResult> <EventKey><![CDATA[rselfmenu_0_0]]></EventKey> </ScanCodeInfo> </xml> |
scancode_push,回应该事件给用户,用户不能收到消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075451</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[scancode_push]]></Event> <EventKey><![CDATA[rselfmenu_0_1]]></EventKey> <ScanCodeInfo> <ScanType><![CDATA[qrcode]]></ScanType> <ScanResult><![CDATA[http://weixin.qq.com/r/pUNnf4HEX9wgrcUc9xa3]]></ScanResult> <EventKey><![CDATA[rselfmenu_0_1]]></EventKey> </ScanCodeInfo> </xml> |
pic_weixin ,下面是一次推送3张相片时的数据
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075552</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[pic_weixin]]></Event> <EventKey><![CDATA[rselfmenu_1_2]]></EventKey> <SendPicsInfo> <Count>3</Count> <PicList> <item> <PicMd5Sum><![CDATA[a6ab74b73a298f49f6fc66f41f88d3c7]]></PicMd5Sum> </item> <item> <PicMd5Sum><![CDATA[5b9aea2b3683c5c21aaf3629739cafd9]]></PicMd5Sum> </item> <item> <PicMd5Sum><![CDATA[2325ff3f39705ac987d3e0660906791d]]></PicMd5Sum> </item> </PicList> <EventKey><![CDATA[rselfmenu_1_2]]></EventKey> </SendPicsInfo> </xml> |
回应上述消息,用户收不到,但微信会继续推送3个图片消息给接口
|
1 2 3 4 5 6 7 8 9 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075562</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/qOTIrRtMKFxZQo3cQ6vYxmfteo0fw2Y00MuuFS6OjlNvTkx0nBQJibjjafQMf4dCtJwyMeP5e3SQCuJpcoJdb8Q/0]]></PicUrl> <MsgId>6064818358471506877</MsgId> <MediaId><![CDATA[AM8Gbiu7S2vTIMS2l9zNCWiMCpeM8wccmKdFxmstHiuAybCbB-08dTQJN40cCIBD]]></MediaId> </xml> |
|
1 2 3 4 5 6 7 8 9 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075564</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/qOTIrRtMKFxZQo3cQ6vYxmfteo0fw2Y0ellMniarWto4zL0pWKhr6a0FSARDeXprSgd0JmgU0YQo2iagGsYc1iaLA/0]]></PicUrl> <MsgId>6064818367061441471</MsgId> <MediaId><![CDATA[2CJKZ2mft-5hWEkVcVmnKwyvp3y59Uzv7YdpBsnGIyTlkMNb0ytU4oimTgimBGyP]]></MediaId> </xml> |
|
1 2 3 4 5 6 7 8 9 |
<xml> <ToUserName><![CDATA[gh_82479813ed64]]></ToUserName> <FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName> <CreateTime>1412075567</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/qOTIrRtMKFxZQo3cQ6vYxmfteo0fw2Y0mwQoENttnmYAz0VTicY3xkO0lhn9mE5r3FB4cF04kia50riajcjY1qvzA/0]]></PicUrl> <MsgId>6064818379946343361</MsgId> <MediaId><![CDATA[VICm1-y8w_MmdpcLYWP0u12HVXrWdhm3c3tdq1PTsbiFFgH6YOcmmIEbZ27z-Qcl]]></MediaId> </xml> |
上述多个图片消息,后台收到都能进行单独回应,用户可以收到响应消息。 […]
View Details在ASP.NET这样的Web应用中,Session是用来保存用户状态的常用手段,不过由于服务器内存空间是有限的,所以Session过期时间设置是很有必要的。在ASP.NET中如何设置Session的过期时间呢,很简单,修改web.config配置。 具体修改方法如下,在web.config中进行如下配置 1 2 3 <system.web> <sessionState mode="InProc" timeout="30"/> </system.web> 在这里指的是Session过期时间为30分钟。也就是说30分钟后如果当前用户没有操作,那么Session就会自动过期了。 from:http://www.cnblogs.com/sjrhero/archive/2010/10/15/1852449.html
View Details我们在一些著名开源项目的版本库中,通常可以看到trunk, branches, tags等三个目录。由于SVN固有的特点,目录在SVN中并没有特别的意义,但是这三个目录却在大多数开源项目中存在,这是因为这三个目录反映了软件开发的通常模式。 trunk是主分支,是日常开发进行的地方。 branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。 tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。 比如一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子: project | +-- trunk + | + +—-- main.cpp (3.0版本的最新文件) + +—-- common.h + +-- branches + | + +-- r1.0 + + | + + +—- main.cpp (1.x版本的最新文件) + + +—- common.h + + + +-- r2.0 + | + +—- main.cpp (2.x版本的最新文件) + +—- common.h + +-- tags (此目录只读) | +-- r1.0 + | + +—- main.cpp (1.0版本的发布文件) + +—- common.h + +-- r1.1 + | + +—- main.cpp (1.1版本的发布文件) + +—- common.h + +-- r1.2 + | […]
View Details首先在Global.asax.cs里增加: protected void Application_PreSendRequestHeaders(object sender, EventArgs e) { HttpContext.Current.Response.Headers.Set("Server", "w3cnet.com"); HttpContext.Current.Response.Headers.Remove("X-AspNet-Version"); HttpContext.Current.Response.Cookies.Remove(".ASPXAUTH"); } 然后web.config的system.webServer节点下增加: <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol> 再看看响应头,或用站长工具查看,完美隐藏。 参考资料: http://www.yn-s.com/news/Details/93
View Details1、指定表单提交方式和路径等
|
1 |
@using (Html.BeginForm("Index", "Home", FormMethod.Get, new { name = "nbform", id = "nbform" })) |
2、指定表单提交为数据方式
|
1 |
@using (Html.BeginForm("ImportExcel", "Stock", FormMethod.Post, new { enctype = "multipart/form-data" })) |
注意, 有时候要加{id=1}不然在点击超过第一页的索引时form后面会自动加上当前页的索引,如果此时再搜索则可能会出来“超出索引值”的错误提示 @using (Html.BeginForm("Index", null, new { id = 1 }, FormMethod.Get)) 3、下面的操作可以防止提交链接后面自带参数
|
1 |
@using (Html.BeginForm("AddDIYBillOfLading", "BillOfLading", new { id ="" }, FormMethod.Post, new { name = "myform", id = "myform" })) |
即,RouteValues的id="" from:http://www.cnblogs.com/firstcsharp/archive/2013/08/05/3238321.html
View Details国外的开源产品较多,而且大多提供免费的社区版本,oa办公系统也不例外。 1、eGroupware eGroupware是一个多用户,在以PHP为基础的API上的定制集为基础开发的,以WEB为基础的工作件套装。目前可用的模板包括:电子邮件,通讯录,日程表,记事簿(备注,任务,电话),内容管理,论坛,书签,维客等。 如果使用Debian/Ubuntu来搭建eGroupware,推荐使用rpm/deb安装包方式进行安装。eGroupware中文支持良好。 eGroupware下载 eGroupware v1.8.002下载 界面预览 软件大小:14.85MB 软件类别:国外软件 | 协同办公 软件语言:多国语言 运行环境:PHP/Mysql, 软件授权:开源软件 更新时间:2011-8-16 9:15:08 相关链接:Home Page eGroupware演示:http://www.egroupware.org/demo 2、GForge GForge是一个基于Web的协同开发平台。它提供一组帮助你的团队进行协同开发的工具,如论坛,邮件列表等。用于创建和控制访问源代码管理库(如CVS,Subversion)的工具。GForge将自动创建一个源代码库并依据项目的角色设置进行访问控制。其它工具还包括:管理文件发布,文档管理,新闻公告,缺陷跟踪,任务管理等。 GForge提供免费的社区版,功能比较全面,而且简体中文语言包汉化完整。 GForge下载 GForge v5.7.1下载 界面预览 软件大小:12.63MB 软件类别:国外软件 | 企业政府 软件语言:多国语言 运行环境:PHP/Mysql, 软件授权:开源软件 更新时间:2011-4-29 13:56:49 相关链接:Home Page GForge演示地址:http://gforge.com/gf/my/ 3、Feng Office Feng Office的前身是opengoo,这是一个历史悠久的在线办公系统,作为后继者的fengoffice,功能自然不含糊。 Feng Office作为一套基于网络的项目协作系统,通过“笔记”、“文档”、“任务”等模块,解决了项目管理过程中的人员管理、成果管理及项目协作的问题;同时,由于其开源的性质,可以免费获得,其友好的用户界面和操作方式,便于学习和部署。 Feng Office下载 Feng Office v1.7.5下载 界面预览 软件大小:8.26MB 软件类别:国外软件 | 协同办公 软件语言:多国语言 运行环境:PHP/Mysql, 软件授权:开源软件 更新时间:2011-6-16 9:31:38 相关链接:Home Page Feng Office演示地址:http://fengoffice.com/web/demo/ 4、Group-Office Group-Office是一个基于Web的办公套件。它采用模块化设计,可扩展性强。主要功能有:用户管理、模块管理、email客户端、文件管理、日历、项目管理、网站管理以及客户关系管理等,可以与PDA和Outlook同步。 Group-Office提供开源、免费的社区版本,提供上图中以中文显示的功能,包括:E-mail,日程表,任务,通讯录、记事本、文件。 Group-Office下载 Group Office v3.7.34下载 界面预览 软件大小:11.55MB 软件类别:国外软件 | 协同办公 软件语言:多国语言 运行环境:PHP/Mysql, 软件授权:开源软件 更新时间:2011-10-19 9:32:16 相关链接:Home Page Group-Office演示地址:http://www.group-office.com/Pricing+and+Sign+up 注册后方可使用在线演示的功能。 5、PHProjekt PHProjekt是一个模块化的协同办公系统用于共享信息和文档。它包括的组件有:团队日历、TimeCard系统、项目管理、请求跟踪、文档管理、通讯录管理、Email客户端、论坛、聊天,记事本、共享书签、待办事项目列表、投票系统等。PHProjekt支持多种协议如ldap,xml/soap和webdav并已经被翻译成36种语言。此外它支持7种数据库包括MySQL、Postgres、Interbase、Oracle、Informix和MS-SQL。 PHProjekt下载 PHProjekt v6.06下载 界面预览 […]
View Details— 来源于网络 — 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回。 xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置 xp_logininfo --*返回有关Windows 认证登录的信息。 xp_msver --*返回有关Microsoft SQL Server 的版本信息 xp_enumgroups --返回Windows用户组列表或在指定域中的全局组列表。 xp_sendmail --将电子邮件发送给指定的收件人(后续版本将删除该功能)。 xp_readmail --阅读SQL Mail收件箱中的邮件(后续版本将删除该功能)。 xp_deletemail --删除Microsoft SQL Server 收件箱中的邮件(后续版本将删除该功能)。 xp_startmail --通过该过程启动SQL Mail将返回两条消息,主要用于故障排除。 xp_stopmail --停止SQL 邮件客户端会话(后续版本将删除该功能)。 xp_grantlogin --授予Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_revokelogin --撤消Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_logevent --将用户定义消息记入SQL Server 日志文件和Windows 事件查看器。 xp_sprintf --设置一系列字符和值的格式并将其存储到字符串输出参数中。每个格式参数都用相应的参数替换。 xp_sqlmaint --使用包含sqlmaint 开关的字符串调用sqlmaint 实用工具(后续版本将删除该功能)。 xp_sscanf --将数据从字符串读入每个格式参数所指定的参数位置。 sp_ActiveDirectory_Obj --控制数据库在Windows活动目录中的注册。 sp_ActiveDirectory_SCP --控制已连接实例的数据库在Windows活动目录中的注册。 sp_add_agent_parameter --将新参数及其值添加到代理配置文件中。 sp_add_agent_profile --为复制代理创建新的配置文件。 sp_add_alert --创建一个警报。 sp_add_category --将指定的作业、警报或操作员类别添加到服务器中。 sp_add_job --*添加由SQLServerAgent 服务执行的新作业。 sp_add_jobschedule --*创建作业计划。 sp_add_jobserver --在指定的服务器中,以指定的作业为目标。 sp_add_jobstep --*在作业中添加一个步骤(操作)。 sp_add_log_shipping_alert_job --检查是否已在此服务器上创建了警报作业,无则创建。 sp_add_log_shipping_primary_database --设置日志传送配置(包括备份作业、本地监视记录及远程监视记录)的主数据库。 […]
View DetailsJSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。 一、JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}’,中括号'[]’,逗号’,’,冒号’:’,双引号’“”’组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。 JSON具有以下的形式: 对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:
|
1 |
var user={"name":"张三","gender":"男","birthday":"1980-8-8"} |
数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:
|
1 |
var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}]; |
字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。 二、对JSON数据进行序列化和反序列化 可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中。 利用DataContractJsonSerializer序列化和反序列化的代码:
|
1 |
1: using System; |
|
1 |
2: using System.Collections.Generic; |
|
1 |
3: using System.Linq; |
|
1 |
4: using System.Web; |
|
1 |
5: using System.Runtime.Serialization.Json; |
|
1 |
6: using System.IO; |
|
1 |
7: using System.Text; |
|
1 |
8: |
|
1 |
9: /// <summary> |
|
1 |
10: /// JSON序列化和反序列化辅助类 |
|
1 |
11: /// </summary> |
|
1 |
12: public class JsonHelper |
|
1 |
13: { |
|
1 |
14: /// <summary> |
|
1 |
15: /// JSON序列化 |
|
1 |
16: /// </summary> |
|
1 |
17: public static string JsonSerializer<T>(T t) |
|
1 |
18: { |
|
1 |
19: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); |
|
1 |
20: MemoryStream ms = new MemoryStream(); |
|
1 |
21: ser.WriteObject(ms, t); |
|
1 |
22: string jsonString = Encoding.UTF8.GetString(ms.ToArray()); |
|
1 |
23: ms.Close(); |
|
1 |
24: return jsonString; |
|
1 |
25: } |
|
1 |
26: |
|
1 |
27: /// <summary> |
|
1 |
28: /// JSON反序列化 |
|
1 |
29: /// </summary> |
|
1 |
30: public static T JsonDeserialize<T>(string jsonString) |
|
1 |
31: { |
|
1 |
32: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); |
|
1 |
33: MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); |
|
1 |
34: T obj = (T)ser.ReadObject(ms); |
|
1 |
35: return obj; |
|
1 |
36: } |
|
1 |
37: } |
序列化Demo: 简单对象Person:
|
1 |
1: public class Person |
|
1 |
2: { |
|
1 |
3: public string Name { get; set; } |
|
1 |
4: public int Age { get; set; } |
|
1 |
5: } |
序列化为JSON字符串:
|
1 |
1: protected void Page_Load(object sender, EventArgs e) |
|
1 |
2: { |
|
1 |
3: Person p = new Person(); |
|
1 |
4: p.Name = "张三"; |
|
1 |
5: p.Age = 28; |
|
1 |
6: |
|
1 |
7: string jsonString = JsonHelper.JsonSerializer<Person>(p); |
|
1 |
8: Response.Write(jsonString); |
|
1 |
9: } |
输出结果:
|
1 |
{"Age":28,"Name":"张三"} |
反序列化Demo:
|
1 |
1: protected void Page_Load(object sender, EventArgs e) |
|
1 |
2: { |
|
1 |
3: string jsonString = "{\"Age\":28,\"Name\":\"张三\"}"; |
|
1 |
4: Person p = JsonHelper.JsonDeserialize<Person>(jsonString); |
|
1 |
5: } |
运行结果: ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用JSON.NET. […]
View Detailsusing System; using System.Collections.Generic; using System.Text; namespace NET.MST.Fourth.StringByte { class StringByte { static void Main(string[] args) { String s = "我是字符串,I am string"; //字节数组转换到字符串 Byte[] utf8 = StringToByte(s, Encoding.UTF8); Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312")); Byte[] unicode = StringToByte(s, Encoding.Unicode); Console.WriteLine(utf8.Length); Console.WriteLine(gb2312.Length); Console.WriteLine(unicode.Length); //转换回字符串 Console.WriteLine(ByteToString(utf8, Encoding.UTF8)); Console.WriteLine(ByteToString(gb2312, Encoding.GetEncoding("GB2312"))); Console.WriteLine(ByteToString(unicode, Encoding.Unicode)); Console.Read(); } static Byte[] StringToByte(String s, Encoding encoding) { return encoding.GetBytes(s); } static String ByteToString(Byte[] b, Encoding encoding) { return encoding.GetString(b); } } } from:http://www.cnblogs.com/brainmao/archive/2011/05/29/2062385.html
View Details介绍 让用户从我们的网站上下载各种类型的文件是一个比较常用的功能,这篇文章就是告诉您如何创建一个.txt文件并让用户下载。 使用代码 虽然在示例里,我先创建了一个text文件,但是你不一定也要这么做,因为这个文件可能在你的网站里已经存在了。如果是这样的话,你只需要使用FileStream去读取它就可以了。 首先,我们将这个text文件读取到一个byte数组中,然后使用Response对象将文件写到客户端就可以了。 Response.AddHeader("Content-disposition", "attachment; filename=" + sGenName); Response.ContentType = "application/octet-stream"; Response.BinaryWrite(btFile); Response.End(); 这段代码是完成这个功能的主要代码。第一句在输出中添加了一个Header,告诉浏览器我们发送给它的是一个附件类型的文件。然后我们设置输出的ContentType是"application/octet-stream",即告诉浏览器要下载这个文件,而不是在浏览器中显示它。 下面是一个MIME类型的列表。 ".asf" = "video/x-ms-asf" ".avi" = "video/avi" ".doc" = "application/msword" ".zip" = "application/zip" ".xls" = "application/vnd.ms-excel" ".gif" = "image/gif" ".jpg"= "image/jpeg" ".wav" = "audio/wav" ".mp3" = "audio/mpeg3" ".mpg" "mpeg" = "video/mpeg" ".rtf" = "application/rtf" ".htm", "html" = "text/html" ".asp" = "text/asp" '所有其它的文件 = "application/octet-stream" 下面是一个完整的如何下载文本文件的示例代码 C# protected void Button1_Click(object sender, EventArgs e) { string sFileName = System.IO.Path.GetRandomFileName(); string sGenName = "Friendly.txt"; //YOu could omit these lines here as you may not want […]
View Details