js操作select标签
html中的select标签 javascript对它们的操作 一、基础理解 复制代码代码如下: var e = document.getElementById("selectId"); e. options= new Option("文本","值") ; //创建一个option对象,即在<select>标签中创建一个或多个<option value="值">文本</option> //options是个数组,里面可以存放多个<option value="值">文本</option>这样的标签 1:options[ ]数组的属性: length属性———长度属性 selectedIndex属性——--当前被选中的框中的文本的索引值,此索引值是内存自动分配的(0,1,2,3…..)对应(第一个文本值,第二个文本值,第三个文本值,第四个文本值……….) 2:单个option的属性(—obj.options[obj.selecedIndex]是指定的某个<option>标签,是一个—) text属性———返回/指定 文本 value属性——返回/指定 值,与<options value="…">一致。 index属性——-返回下标, selected 属性——-返回/指定该对象是否被选中.通过指定 true 或者 false,可以动态的改变选中项 defaultSelected 属性—--返回该对象默认是否被选中。true / false。 3:option的方法 增加一个<option>标签—--obj.options.add(new("文本","值"));<增> 删除一个<option>标签—--obj.options.remove(obj.selectedIndex)<删> 获得一个<option>标签的文本—--obj.options[obj.selectedIndex].text<查> 修改一个<option>标签的值—--obj.options[obj.selectedIndex]=new Option("新文本","新值")<改> 删除所有<option>标签—--obj.options.length = 0 获得一个<option>标签的值—--obj.options[obj.selectedIndex].value 注意: a:上面的写的是如这样类型的方法obj.options.function()而不写obj.funciton,是因为为了考虑在IE和FF 下的兼容,如obj.add()只能在IE中有效. b:obj.option中的option不需要大写,new Option中的Option需要大写 二 、应用 复制代码代码如下: <html> <head> <script language="javascript"> function number(){ var obj = document.getElementById("mySelect"); //obj.options[obj.selectedIndex] = new Option("我的吃吃","4");//在当前选中的那个的值中改变 //obj.options.add(new Option("我的吃吃","4"));再添加一个option //alert(obj.selectedIndex);//显示序号,option自己设置的 //obj.options[obj.selectedIndex].text = "我的吃吃";更改值 //obj.remove(obj.selectedIndex);删除功能 } </script> </head> <body> <select id="mySelect"> <option>我的包包</option> <option>我的本本</option> <option>我的油油</option> <option>我的担子</option> </select> <input […]
View DetailsEF查询分页
1 2 3 4 5 6 7 |
static List<T> GetPageList(Func<T,bool> whereLambda,Func<T,object> orderLambda,int pageSize,int pageIndex) where T:class { EFEntities context=new EFEntities();//实例化上下文 var list=context.Set<T>().where(whereLambda).orderByDescending(orderLambda).Skip((pageIndex-1)*pageSize).Take(pageSize).Select(s=>s); return list.ToList(); } |
完善后
1 2 3 4 5 6 7 8 9 |
//EF lanbda 分页 public List<dynamic> getPageDate<T, TKey>(Expression<Func<T, dynamic>> select, Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, int pageIndex, int pageSize, out int Total) where T : class { CIK_NewsEntities db = new CIK_NewsEntities(); Total = db.Set<T>().Where(where).Count(); var list = db.Set<T>().Where(where).OrderByDescending(order).Select(select).Skip((pageIndex - 1) * pageSize).Take(pageSize); return list.ToList(); } |
使用:
1 2 3 4 |
int Total_ = 0; rptCate.DataSource = getPageDate<Category, int>(c => new { c.Name, c.CreatedDate, c.CreatedBy }, c => c.Id > 0, c => c.Id, 2, 4, out Total_); rptCate.DataBind(); this.Label1.Text = Total_.ToString(); |
FROM:http://www.cnblogs.com/juexin/p/4273490.html
View Details楞严咒
楞严咒是咒中之王,亦是咒中最长者,这个咒关系整个佛教的兴衰。世界上有人持诵楞严咒,就是正法存在。没有人持诵楞严咒,就是没有正法了。 楞严咒被誉为咒中之王,此咒有大威力,放大光明,能以佛之净德覆盖一切,以白净大慈悲遍覆法界,有不可思议之大威德,持此咒的人,能退避一切怨敌,摧毁一切邪巫诅咒,避免一切灾难横祸,能降伏一切天魔外道,消除一切奇难杂症恶疾。又可避免一切地水火风空、刀兵、星变、饥馑、牢狱、魔类、冤仇、疾病等灾。所求诸愿,悉能成就,求子,求长寿,等等。持诵此咒的人,常得日月星斗欢喜拥护,大降吉祥,逢凶化吉。命终之后,十方国土,随愿往生。 楞严咒叫佛顶光明,是佛的顶上化佛所说。所以是微妙不可思议的。每一句有每一句的用途,每一字有每一字的奥妙,都具足不可思议。「佛顶光明」就是表示咒的力量能破除一切黑暗,能成就一切功德。你若能受持楞严咒将来一定成佛,一定得无上正等正觉。离开咒文能念叫诵,对着咒文念叫读。若能常诵楞严咒,可以消除宿世业障。这是楞严咒的妙用。何谓「无」?高明无极。光明到极点了,没有再超过这光明的。「上」是尊上莫等的上。没有再比这更尊贵更高尚了。「神」就是不可思议,也就是威灵叵测的意思。「咒」就是感应道交。它有一种力量。你念咒就有感应。「佛顶光明摩诃萨怛多般怛啰无上神咒」,佛顶的光明犹如大白伞盖来护持一切诵持神咒的人。以上为其名称的大概意思。 缘起 楞严咒其因缘为阿难被摩登伽女用邪咒所迷,在阿难的戒体快要被毁坏时,佛陀令文殊菩萨持楞严咒前往救护阿难,阿难才被救醒归佛。故知楞严咒乃《楞严经》之主体,没有楞严咒的因缘,就没有《楞严经》。 全文介绍 大佛顶首楞严神咒祈请法 大兴善寺三藏沙门大广不空 奉诏译 稽首光明大佛顶 如来万行首楞严 开无相门圆寂宗 字字观照金刚定 瑜伽妙旨传心印 摩诃衍行总持王 说此秘密悉怛多 解脱法身金刚句 菩提力大虚空量 三昧智印海无边 不持斋者是持斋 不持戒者名持戒 八万四千金刚众 行住坐卧每随身 十方法界诸如来 护念加威受持者 念满一万八千遍 遍遍入于无相定 号称坚固金刚幢 自在得名人胜佛 纵使骂詈不为过 诸天常闻说法声 神通变化不思议 陀罗尼门最第一 大圣放光佛顶力 掩恶扬善证菩提 唯闻念者薝葡香 不嗅一切余香气 僧破二百五十戒 比丘尼犯八波罗 闻念佛顶大明王 还得具足声闻戒 若人杀害怨家众常行十恶罪无边 暂闻灌顶不思议 恒沙罪障皆消灭 现受阿鼻大地狱 镬汤炉炭黑绳人 若发菩提片善心 一闻永得生天道 我今依经说偈颂 无量功德普庄严 听者念者得总持 同获涅槃寂灭乐 大佛顶首楞严神咒 南无楞严会上佛菩萨(三称) 妙湛总持不动尊 首楞严王世希有 销我亿劫颠倒想 不历僧祗获法身 愿今得果成宝王 还度如是恒沙众 将此深心奉尘刹 是则名为报佛恩 伏请世尊为证明 五浊恶世誓先入 如一众生未成佛 终不于此取泥洹 大雄大力大慈悲 希更审除微细惑 令我早登无上觉 于十方界坐道场 舜若多性可销亡 烁迦罗心无动转 南无常住十方佛 南无常住十方法 南无常住十方僧 南无释迦牟尼佛 南无佛顶首楞严 南无观世音菩萨 南无金刚藏菩萨 尔时世尊。从肉髻中。涌百宝光。光中涌出。千叶宝莲。有化如来。坐宝华中。顶放十道。百宝光明。一一光明。皆遍示现。十恒河沙。金刚密迹。擎山持杵。遍虚空界。大众仰观。畏爱兼抱。求佛哀佑。一心听佛。无见顶相。放光如来。宣说神咒。 【第一会】 南无萨怛他,苏伽多耶,阿啰诃帝,三藐三菩陀写。萨怛他,佛陀俱胝 瑟尼钐。南无萨婆,勃陀勃地,萨跢鞞弊。南无萨多南,三藐三菩陀,俱知喃。娑舍啰婆迦,僧伽喃。南无卢鸡阿罗汉哆喃。南无苏卢,多波那喃。南无娑羯唎陀,伽弥喃。南无卢鸡三藐伽哆喃。三藐伽波啰,底波多那喃。南无提婆离瑟赧。南无悉陀耶,毗地耶,陀啰离瑟赧。舍波奴,揭啰诃,娑诃娑啰,摩他喃。南无跋啰诃摩尼。南无因陀啰耶。南无婆伽婆帝。嚧陀啰耶。乌摩般帝。娑酰夜耶。南无婆伽婆帝。那啰野拏耶。槃遮摩诃三慕陀啰。南无悉羯唎多耶。南无婆伽婆帝。摩诃迦啰耶。地唎般剌那伽啰。毗陀啰波拏迦啰耶。阿地目帝。尸摩舍那泥婆悉泥。摩怛唎伽拏。南无悉羯唎多耶。南无婆伽婆帝。多他伽跢俱啰耶。南无般头摩俱啰耶。南无跋阇啰俱啰耶。南无摩尼俱啰耶。南无伽阇俱啰耶。南无婆伽婆帝。帝唎茶,输啰西那。波啰诃啰拏啰阇耶。跢他伽多耶。南无婆伽婆帝。南无阿弥多婆耶。跢他伽多耶。阿啰诃帝。三藐三菩陀耶。南无婆伽婆帝。阿刍鞞耶。跢他伽多耶。阿啰诃帝。三藐三菩陀耶。南无婆伽婆帝。鞞沙阇耶,俱卢吠柱唎耶。 般啰婆啰阇耶。跢他伽多耶。南无婆伽婆帝。三补师毖多。萨怜捺啰剌阇耶。跢他伽多耶。阿啰诃帝。三藐三菩陀耶。南无婆伽婆帝。舍鸡野母那曳。跢他伽多耶。阿啰诃帝。三藐三菩陀耶。南无婆伽婆帝。剌怛那鸡都啰阇耶。跢他伽多耶。阿啰诃帝。三藐三菩陀耶。帝瓢,南无萨羯唎多。翳昙婆伽婆多。萨怛他伽都瑟尼钐。萨怛多般怛嚂。南无阿婆啰视耽。般啰帝扬歧啰。萨啰婆,部多揭啰诃。尼揭啰诃,羯迦啰诃尼。跋啰毖地耶,叱陀你。阿迦啰,密唎柱。般唎怛啰耶,儜揭唎。萨啰婆,盘陀那,目叉尼。萨啰婆,突瑟咤。突悉乏,般那你,伐啰尼。赭都啰,失帝南。羯啰诃,娑诃萨啰若阇.毗多崩娑那羯唎。阿瑟咤冰舍帝南。那叉刹怛啰若阇。波啰萨陀那羯唎。阿瑟咤南。摩诃揭啰诃若阇。毗多崩萨那羯唎。萨婆舍都嚧,你婆啰若阇。呼蓝突悉乏,难遮那舍尼。毖沙舍,悉怛啰。阿吉尼,乌陀迦啰若阇。阿般啰,视多具啰。摩诃般啰,战持。摩诃迭多。摩诃帝阇。摩诃税多,阇婆啰。摩诃跋啰,盘陀啰,婆悉你。阿唎耶多啰。毗唎俱知。誓婆毗阇耶。跋阇啰,摩礼底。毗舍嚧多。勃腾罔迦。跋阇啰,制喝那阿遮。摩啰制婆,般啰质多。跋阇啰,擅持。毗舍啰遮。扇多舍,鞞提婆,补视多。苏摩嚧波。摩诃税多。阿唎耶多啰。摩诃婆啰,阿般啰。跋阇啰,商揭啰制婆。 跋阇啰,俱摩唎。俱蓝陀唎。跋阇啰,喝萨多遮。毗地耶,乾遮那,摩唎迦。啒苏母,婆羯啰多那。鞞嚧遮那,俱唎耶。夜啰菟,瑟尼钐。毗折蓝婆,摩尼遮。跋阇啰,迦那迦,波啰婆。嚧阇那,跋阇啰,顿稚遮。税多遮,迦摩啰。刹奢尸,波啰婆。翳帝夷帝。母陀啰羯拏。娑鞞啰忏。掘梵都。印兔那么么写。 【第二会】 乌[合牛]����。唎瑟揭拏。般剌舍悉多。萨怛他,伽都瑟尼钐。虎[合牛]����。都卢雍。瞻婆那。虎[合牛]。都卢雍。悉耽婆那。虎[合牛]。都卢雍。波啰瑟地耶,三般叉,拏羯啰。虎[合牛]����。都卢雍。萨婆药叉,喝啰刹娑。揭啰诃若阇。毗腾崩萨那羯啰。虎[合牛]。都卢雍。者都啰,尸底南。揭啰诃,娑诃萨啰南。毗腾崩萨那啰。虎[合牛]。都卢雍。啰叉。婆伽梵。萨怛他,伽都瑟尼钐。波啰点,阇吉唎。摩诃娑诃萨啰。勃树娑诃萨啰,室唎沙。俱知娑诃萨泥,帝[口隶]。阿弊提视婆唎多。咤咤罂迦。摩诃跋阇嚧陀啰。帝唎菩婆那。曼茶啰。乌[合牛][2-4][5] 。娑悉帝 薄婆都。么么。印兔那么么写。 […]
View DetailsIIS FTP 出现 530 User cannot log in, home Directory Inaccessible 错误处理方法
故障现象: 登陆FTP的时候提示 530 User waadmin cannot log in, home directory inaccessible. 故障原因: FTP根目录权限不够 第一种解决方法: 把该用户所在组加个“读取”权限 或参考下面的方法 原因: 可能是在FTP服务器创建时,选择了FTP隔离用户模式。 解决方法: 在用户的ftp根目录下创建LocalUser\用户名 这样的目录,因为用户登录时会自动将主目录移到这里。如果打算允许FTP站点提供匿名登录应在LocalUser目录下另建一个public的子目录LocalUser\public from:http://www.jb51.net/article/30147.htm
View DetailsFacebook 开源 AI 所使用的硬件平台 'Big Sur'
Facebook 今开源其 AI 所使用的硬件平台 'Big Sur’。’Big Sur' 是兼容开放机架的 GPU 加速硬件平台。 人们经常会忽略 Facebook 的人工智能,但是 Facebook 在很多时候都使用了大量的人工智能。Facebook 在AI 上面大有研究,使用机器学习来帮助获取更好的新闻 feed,整理照片和视频内容,甚至是读故事或者玩游戏。现在,Facebook 开源了 AI 所使用的硬件 Big Sur。 Facebook 还宣布近期会发布 AI 硬件设计到 Open Compute Project,并承诺给社区一个根据现有组件构建专为 AI 任务的系统设计。这个设计把 8 个 NVIDIA Tesla M40 GPUS 绑定在一个简单的,可服务的主板上。CPU 的散热只需一个螺丝刀即可解决。 “这可以给予 AI 研究者一些帮助,分享技巧和技术”Facebook 发表声明说,“我们相信这个开源协作有助于未来的创新设计,让我们离构建复杂 AI 系统又更进一步。” 更多内容请看 Facebook 声明:https://code.facebook.com/posts/1687861518126048?__mref=message_bubble from:http://www.oschina.net/news/68892/facebook-makes-the-hardware-it-uses-for-ai-open-source via engadget.com
View Details15 个必知的 Android 开发者选项
Android开发者选项,看起来很简单的事情,其实很多同学对它了解得不够,Google用心良苦得为我们设计了这么多小开关都是有它的作用的,今天也花了点时间,过了一遍全部的30多个开关,从中整理出15个对日常Android开发比较有帮助的选项。 需要指出的是,不同的ROM对开发者选项的支持不一样,精简掉一些很正常,我下面提到的都是官方支持的功能,当然不同的官方版本支持程度也不一样,你手机上找不到也别奇怪。 抱歉这里不介绍开发者选项在哪怎么开启之类的问题。 1. Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开启它后只要插着USB线就不需要总去解锁屏幕啦。 2. Select runtime(Dalvik or ART) ART runtime下你的应用会更加丝滑,目前高版本的Android上已经直接是ART runtime了,但作为Android开发也许需要保证你的应用在两种runtime下都能正常运行,这可能是测试时需要更多考虑的。 3. Process stats 里面有关于当前运行进程的一切信息,对于一般用户,它就是一堆无意义的数字,对于Android开发人员来说,调试时这些信息也许可以帮你大忙。 4. USB debugging 这个无需介绍,不开它怎么调试呢?(虽然现在都流行无线调试了) 5. Allow mock locations 当你的应用需要用到GPS功能,获取位置信息时(比如天气应用),可以通过它搭配一些位置模拟应用,模拟全球任何地点。(还能干什么?机智的你肯定想到啦) 6. Show surface updates 在界面绘制时,闪烁提醒,开启它后简直能闪瞎你的眼睛,但有时候我们需要精确知道具体的界面绘制细节时,不得不需要忍受这种折磨。 7. Show layout bounds 显示布局格子,当你看到一个应用有很棒的界面效果,想知道它是怎么布局的?开启这个功能即可。我更常用的使用场景是:每当有PM过来问我人家这个界面是Native实现的,还是类似Hybrid方案的Web实现时,我就让他开启这个功能,WebView是一个整体的格子,Native View是各种小格子组合而成。(除非自己重绘实现自定义View, 一般复杂布局也不会这么干) 8. Force RTL layout direction 强制RTL布局,RTL也就是Right To Left,阿拉伯国家一般有这种文化,类似古时候的中国,文字从右往左读,包括界面布局也是从右往左的,感觉操作习惯都跟我们是镜像的,如果你跟我一样不幸需要做这种坑爹适配的话,这也是必须掌握的技能。 9. Animation scale 动画的尺度、速度调整也是很有用的功能,尤其在实现复杂的组合动画效果时,调慢点可以看得更清楚,当然你可以在自己代码里调慢,但每次改代码重新build很麻烦对不对?而且如果是PM走过来让你研究一下某款App的酷炫动画效果呢? 10. Simulate secondary displays 它允许你模拟不同屏幕尺寸下应用的表现,IDE里虽然也有类似的功能,可那毕竟只是个静态的效果。 11. Debug GPU overdraw 这里是指不正确的过度绘制: 原色: 没有过度绘制 蓝色: 一次过度绘制 绿色: 两次过度绘制 粉色: 三次过度绘制 红色: 四次及以上过度绘制 值得提醒的是,过度绘制有时是无法避免的,Android建议是不要超过一次过度绘制,也就是可以是蓝色的,不能绿了。 12. Strict mode enabled 严苛模式下,当应用做了一些影响性能的事情,屏幕会闪一下提醒你。你也可以在代码里为自己的应用开启严苛模式,一旦发现一些性能问题,就会有详细Log输出, 为避免影响线上用户,建议只在Debug模式下开启。 13. Show CPU usage 在你屏幕右上角显示一个小窗口,提示当前CPU的各种信息,在性能调试时会有一些帮助,看是否是CPU的负载过高导致了性能问题。 14. Profile GPU rendering […]
View Details在Entity Framework中实现指定字段更新
又来一篇,大家也许都嫌烦了。但是写博客既能提高自己,又能帮助别人,而且每次写的过程中和发布出来之后都有收获,真是太赚了!麻烦大家忍一忍吧。 言归正题,在之前的一篇随笔“准备用Entity Framework实现数据的按需更新”中,我们实现了按需更新,但和这里的指定字段更新的应用场景不一样。 之前的按需更新的应用场景是:把需要更新与不需要更新的数据都给Entity Framework,由EF自己判断实际需要更新哪些。 现在的应用场景是:我明确知道要更新哪个字段,让EF做的只是更新这个操作,其他不用操心。 下面我们通过一个比喻来比较一下两者的区别。 比如我有一辆车想在汽车修理店更换一些部件。我把车停在车库里,来到修理间。这时,我就不能再直接接触这部车,必须通过修理间的工作人员。工作人员给我一个汽车模型,我有任何更换部件的想法,只能通过这个模型告诉他。 对应于第一种按需更新的场景,我不知道汽车需要实际更换哪些部件,我只知道更换后应该是什么样的。 流程是: 1. 告诉工作人员车牌号码,让他按照我放在车库中的汽车,制作一个一模一样的模型。 2. 工作人员把制作好的模型交给我。 3. 我在这个汽车模型的基础上修改成我想要的样子(但我不知道哪些部件要换,哪些部件不要换)。 4. 把修改好的汽车模型交给工作人员,让他去修理就行了。 5. 我悠然自得地去逛街,不用操心任何事。 对应于第二种根据指定字段更新的场景,我要更换前车灯,汽车修理店你不用管前车灯有没有坏,我就是要换,就是想让你们挣钱。 流程是: 1. 我随手从旁边拿了一个空汽车模型,修改为我想要的前车灯。 2. 把这个汽车模型交给工作人员,让他去修理就行了。 3. 我悠然自得地去逛街,不用操心任何事。 对于第二种场景,如果我们采用第一种场景的操作流程,工作人员累,效率低,费用自然也高。用第二个流程是必然的选择。 今天,我们终于找到了针对第二个流程的解决方法。 比如,我们要更新某个Blog的上次更新时间,我们只需要: 1. 新建一个Blog实体对象,告诉他要更新的Blog的ID以及“上次更新时间”。 2. 把这个实体对象交给Entity Framework,让他完成更新。 代码如下: public void UpdateBlogCoinfigLastUpdatedTest() { using (BlogDbContext context = new BlogDbContext()) { var blog = new Blog() { BlogID = 0, LastModified = DateTime.Now }; context.BlogConfigs.Attach(blog); var stateEntry = ((IObjectContextAdapter)context).ObjectContext. ObjectStateManager.GetObjectStateEntry(blog); stateEntry.SetModifiedProperty("LastUpdated"); context.SaveChanges(); } } EF生成的SQL语句如下: exec sp_executesql N’update [dbo].[blog_Config] set [LastUpdated] = @0 where ([BlogID] = @1) ',N’@0 datetime2(7),@1 int',@0=’2011-04-06 14:12:28.2129938′,@1=0 […]
View Details这是世界上最"老"的婴儿,他被冷冻了23年才出生~
一对澳大利亚的小夫妻Alex和Vi生了他们自己的宝宝和Xavier Powell…… 但这不是一个普通的婴儿…… 有人说,他是“世界上最老的婴儿”。 因为,孕育他的精子来自23年前!!! 事情是这样的…… 那还是在1990年,宝宝的爸爸才15岁时…… 当年,Alex被确诊为“霍奇金淋巴瘤”,必须立即接受化疗。 那天早上他完全震惊了!想一想好可怕,他觉得自己还那么年轻却被诊断出癌症…… 可是故事就是这么巧合,就在Alex被诊断为癌症的那天早上,他的继母Patricia在火车上遇到了一个女人。她的18岁儿子也被诊断为癌症,在接受化疗之后,孩子的个子出奇的小。 “那个女人告诉我青少年接受化疗之后会让身体变虚弱,并且化疗的副作用还会导致不育。” Patricia表示如果不是碰到这个女人,她也不会考虑到这些事情。 一番思索之后,Patricia拖着Alex去了精子银行存精。 Patricia现在回想当年的情景…… “我现在还记得他当时的样子。一手拿着装精子的容器,一边红着脸,满脸疑惑问我下一步该做什么。” 当时那种情况,本来就很尴尬啊…… 后来他终于撸出了一管……存完精之后,Alex就开始了漫长的和癌症斗争的岁月。 最后的结果,他战胜了癌症,去失去了生育能力。 康复后的他成了一名脊椎按摩师。 一次偶然的机会他遇到了后来的妻子Vi。 “我从来没想过冷冻精子,直到我遇到了她。我们想要自己的小孩,可是我不知道存了20多年的精子是不是真的还能用。” 在2013年底,他跟妻子一起来到冷冻银行取精,并做了试管受精。 Vi在怀胎十月后诞下了这个婴儿。 连做试管婴儿的医护人员都表示:“23年的精子,这个孩子应该是目前世界上最“老”的婴儿……” 无论如何,没有什么比获得完整的小家庭更开心的事儿了不是么~ ————— 日月若昕:继母挺好的都是正能量 曼_舞霓裳:天使一样的继母 我来宣传仙剑的:继母加分 _vanessa_527:好机智!! 稚子留美君:小宝宝好可爱 希望他健康成长 十月初五的夏沫:真真的这幸福太不容易了 想和自习室相爱的小七:宝宝在23年前就等着跟麻麻邂逅 军师333:所以他到底是怎么撸出那一管的 饭安迪:他很幸运也很幸福 from:http://news.163.com/15/1208/12/BAAIK6N1000155K8.html
View Details在.net中读写config文件的各种方法
今天谈谈在.net中读写config文件的各种方法。 在这篇博客中,我将介绍各种配置文件的读写操作。 由于内容较为直观,因此没有过多的空道理,只有实实在在的演示代码, 目的只为了再现实战开发中的各种场景。希望大家能喜欢。 通常,我们在.NET开发过程中,会接触二种类型的配置文件:config文件,xml文件。 今天的博客示例也将介绍这二大类的配置文件的各类操作。 在config文件中,我将主要演示如何创建自己的自定义的配置节点,而不是介绍如何使用appSetting 。 请明:本文所说的config文件特指app.config或者web.config,而不是一般的XML文件。 在这类配置文件中,由于.net framework已经为它们定义了一些配置节点,因此我们并不能简单地通过序列化的方式去读写它。 config文件 – 自定义配置节点 为什么要自定义的配置节点? 确实,有很多人在使用config文件都是直接使用appSetting的,把所有的配置参数全都塞到那里,这样做虽然不错, 但是如果参数过多,这种做法的缺点也会明显地暴露出来:appSetting中的配置参数项只能按key名来访问,不能支持复杂的层次节点也不支持强类型, 而且由于全都只使用这一个集合,你会发现:完全不相干的参数也要放在一起! 想摆脱这种困扰吗?自定义的配置节点将是解决这个问题的一种可行方法。 首先,我们来看一下如何在app.config或者web.config中增加一个自定义的配置节点。 在这篇博客中,我将介绍4种自定义配置节点的方式,最终的配置文件如下:
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 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MySection111" type="RwConfigDemo.MySection1, RwConfigDemo" /> <section name="MySection222" type="RwConfigDemo.MySection2, RwConfigDemo" /> <section name="MySection333" type="RwConfigDemo.MySection3, RwConfigDemo" /> <section name="MySection444" type="RwConfigDemo.MySection4, RwConfigDemo" /> </configSections> <MySection111 username="fish-li" url="http://www.cnblogs.com/fish-li/"></MySection111> <MySection222> <users username="fish" password="liqifeng"></users> </MySection222> <MySection444> <add key="aa" value="11111"></add> <add key="bb" value="22222"></add> <add key="cc" value="33333"></add> </MySection444> <MySection333> <Command1> <![CDATA[ create procedure ChangeProductQuantity( @ProductID int, @Quantity int ) as update Products set Quantity = @Quantity where ProductID = @ProductID; ]]> </Command1> <Command2> <![CDATA[ create procedure DeleteCategory( @CategoryID int ) as delete from Categories where CategoryID = @CategoryID; ]]> </Command2> </MySection333> </configuration> |
同时,我还提供所有的示例代码(文章结尾处可供下载),演示程序的界面如下: config文件 – Property 先来看最简单的自定义节点,每个配置值以属性方式存在:
1 |
<MySection111 username="fish-li" url="http://www.cnblogs.com/fish-li/"></MySection111> |
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MySection1 : ConfigurationSection { [ConfigurationProperty("username", IsRequired = true)] public string UserName { get { return this["username"].ToString(); } set { this["username"] = value; } } [ConfigurationProperty("url", IsRequired = true)] public string Url { get { return this["url"].ToString(); } set { this["url"] = value; } } } |
小结: 1. 自定义一个类,以ConfigurationSection为基类,各个属性要加上[ConfigurationProperty] ,ConfigurationProperty的构造函数中传入的name字符串将会用于config文件中,表示各参数的属性名称。 2. 属性的值的读写要调用this[],由基类去保存,请不要自行设计Field来保存。 3. 为了能使用配置节点能被解析,需要在<configSections>中注册: <section name="MySection111" type="RwConfigDemo.MySection1, RwConfigDemo" /> ,且要注意name="MySection111"要与<MySection111 ….. >是对应的。 说明:下面将要介绍另三种配置节点,虽然复杂一点,但是一些基础的东西与这个节点是一样的,所以后面我就不再重复说明了。 config文件 – Element 再来看个复杂点的,每个配置项以XML元素的方式存在:
1 2 3 |
<MySection222> <users username="fish" password="liqifeng"></users> </MySection222> |
实现代码如下:
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 |
public class MySection2 : ConfigurationSection { [ConfigurationProperty("users", IsRequired = true)] public MySectionElement Users { get { return (MySectionElement)this["users"]; } } } public class MySectionElement : ConfigurationElement { [ConfigurationProperty("username", IsRequired = true)] public string UserName { get { return this["username"].ToString(); } set { this["username"] = value; } } [ConfigurationProperty("password", IsRequired = true)] public string Password { get { return this["password"].ToString(); } set { this["password"] = value; } } } |
小结: 1. 自定义一个类,以ConfigurationSection为基类,各个属性除了要加上[ConfigurationProperty] 2. 类型也是自定义的,具体的配置属性写在ConfigurationElement的继承类中。 config文件 – CDATA 有时配置参数包含较长的文本,比如:一段SQL脚本,或者一段HTML代码,那么,就需要CDATA节点了。假设要实现一个配置,包含二段SQL脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<MySection333> <Command1> <![CDATA[ create procedure ChangeProductQuantity( @ProductID int, @Quantity int ) as update Products set Quantity = @Quantity where ProductID = @ProductID; ]]> </Command1> <Command2> <![CDATA[ create procedure DeleteCategory( @CategoryID int ) as delete from Categories where CategoryID = @CategoryID; ]]> </Command2> </MySection333> |
实现代码如下:
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 |
public class MySection3 : ConfigurationSection { [ConfigurationProperty("Command1", IsRequired = true)] public MyTextElement Command1 { get { return (MyTextElement)this["Command1"]; } } [ConfigurationProperty("Command2", IsRequired = true)] public MyTextElement Command2 { get { return (MyTextElement)this["Command2"]; } } } public class MyTextElement : ConfigurationElement { protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey) { CommandText = reader.ReadElementContentAs(typeof(string), null) as string; } protected override bool SerializeElement(System.Xml.XmlWriter writer, bool serializeCollectionKey) { if( writer != null ) writer.WriteCData(CommandText); return true; } [ConfigurationProperty("data", IsRequired = false)] public string CommandText { get { return this["data"].ToString(); } set { this["data"] = value; } } } |
小结: 1. 在实现上大体可参考MySection2, 2. 每个ConfigurationElement由我们来控制如何读写XML,也就是要重载方法SerializeElement,DeserializeElement config文件 – Collection
1 2 3 4 5 |
<MySection444> <add key="aa" value="11111"></add> <add key="bb" value="22222"></add> <add key="cc" value="33333"></add> </MySection444> |
这种类似的配置方式,在ASP.NET的HttpHandler, HttpModule中太常见了,想不想知道如何实现它们? 代码如下: 小结: 1. 为每个集合中的参数项创建一个从ConfigurationElement继承的派生类,可参考MySection1 2. 为集合创建一个从ConfigurationElementCollection继承的集合类,具体在实现时主要就是调用基类的方法。 3. 在创建ConfigurationSection的继承类时,创建一个表示集合的属性就可以了,注意[ConfigurationProperty]的各参数。 config文件 – […]
View Details微信公众平台开发(104) 自定义菜单扫一扫、发图片、发地理位置
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的重要功能。微信增加了点击菜单后调起扫一扫(支持二维码/一维码)、发图片、发地理位置的能力,需开发实现。原有自定义菜单开发权限的公众号,均可获得以上能力。 在这篇微信公众平台开发教程中,我们将介绍如何在自定义菜单上开发扫一扫、发图片、发地理位置等功能。原有点击和跳转事件的开发,请参考微信公众平台开发(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