[转载]编辑器篇——FCKeditor自定义上传路径配置

mikel阅读(1065)

[转载][项目过程中所遇到的各种问题记录]编辑器篇——FCKeditor自定义上传路径配置 – kyo-yo – 博客园.

上一篇文章中,我介绍了FCKeditor的一些相关知识以及我在使用过程中碰到的一些问题及解决方案,今天这篇则是主要记录如何通过FCKeditor来分类管理上传的文件。

以下是本文所要介绍的内容:

1、FCKeditor上传文件分析

2、FCKeditor上传文件路径分类配置实现

一、FCKeditor上传文件分析

使用过FCKeditor的朋友肯定都知道,FCKeditor的文件上传的文件都是保存在自定义的目录下,而且保存的目录仅仅按照文件类型进行了划分,只有4个:file、flash、image和media(FCKeditor有内置的管理器可以自由建立文件夹,但是由于并不安全所以这块被我关闭掉了,用户所要做的事情就是上传), 而实际的应用过程中我们不可能将这些同类型的文件放在一个文件夹下,我们需要有特殊的逻辑来存放,比如:新闻相关文件是按照月份来存放、博客资源是按照博 主的用户名来存放等等,这时FCKeditor的基本上就满足不了我这个需求了,所以就需要研究FCKeditor的源码进行简单修改来达到我们的目的。

FCKeditor主要由2部分组成,一部分就是FCKeditor的HTML包,包含了JS、HTML页面主要负责与客户端的交互,而另一部分就是具体的C#程序集FredCK.FCKeditorV2。

其中FCKeditor的上传部分主要也分2个部分:

1、面向客户端UserControl——config.ascx(存放于fckeditor\editor\filemanager\connectors\aspx\下)

2、服务器端负责上传的具体类:FredCK.FCKeditorV2.FileBrowser.Config.cs

先看下FredCK.FCKeditorV2中的类关系图:

pic86

这张类图中有关上传文件的类主要有3个FileWorkerBase、TypeConfig和Config,下面分别来介绍下这3个类:

1、FileWorkerBase,一个抽象类,主要负责文件管理,其中有关文件上传的主要是FileUpload(负责文件上床)和ServerMapFolder(定位服务器上路径地址)这2个方法(具体有关内容可以自行查看源码)。

2、TypeConfig,这个类主要用于辅助FileWorkerBase,为FileWorkerBase提供所需路径。

3、Config,用户控件的具体后台类,负责与前台用户控件交互。

本来我的设想是通过FCKeditor自身的类来实现的,这样只需在实际页面控件上设置相应的属性既可,可惜在实际的研究过程中发现不可行,因为 FCKeditor有关文件管理这块是和其控件类是分开的,文件的上传需要通过FileWorkerBase来实现,所以FCKeditor控件上配置的 属性在FileWorkerBase是无法获取到的,所以还是得从上面所说的3个类来做文章。

二、FCKeditor上传文件路径分类配置实现

现在就要相办法来实现上传文件路径的配置,首先我们可以知道FileWorkerBase.FileUpload这个方法是用来上传文件的,其中:

1 string sServerDir = this.ServerMapFolder(resourceType, currentFolder, isQuickUpload);

这句代码是用来获取保存的路径,知道了这点我们就可以想办法把currentFolder这个变量的值进行更换,改成我们所配置的路径。

这时就需要用户控件Config出场了,因为这个用户控件主要就是暴露给客户端,负责和客户端交互,我们查看下其代码可以发现在其ascx中包含了 一段服务器脚本代码,其中有个方法SetConfig就是用来设置上传文件允许的类型、上传的默认路径的,所以我们只需在这里新增我们的配置。

首先,在FredCK.FCKeditorV2.FileBrowser.Config.cs中新增一个属性:

1 public string UploadPath { get; set; }

这个属性是用来设置存放上传文件的具体个性化路径,与配置的FCKeditor:UserFilesPath不冲突,因为 FCKeditor:UserFilesPath是设置存放所有文件的根路径,如:“~/Upload/”,而UploadPath则是配置基于上传根目 录的个性化路径,如:“News”等,增加好这个属性后就可以在ascx文件中增加具体的配置路径,如:

1 UploadPath = "News/" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString();

我这边配置的是一个新闻配置,按照年月分隔。

这步做完并没有结束,还需要做2步操作:

1、关闭文件浏览器,在fckconfig.js文件中将FCKConfig.LinkBrowser、 FCKConfig.ImageBrowser和FCKConfig.FlashBrowser都置为false,这样上传图片只能通过下图中上传选项卡 进行上传(也就是fckeditor代码中的快速上传—QuickUpload),同时无法查看服务器中的文件:

pic87

2、更改路径获取代码,在TypeConfig类中将GetQuickUploadPath方法改为以下代码:

1 internal string GetQuickUploadPath()
2 {
3 string path = this.FileWorker.Config.UploadPath;
4 if (_QuickUploadPath == null && string.IsNullOrEmpty(path) == false)
5 _QuickUploadPath = QuickUploadPath.Replace("%UserFilesPath%",
6 System.IO.Path.Combine(this.FileWorker.Config.UserFilesPath, path));
7
8 return _QuickUploadPath;
9 }

主要将path获取改成了从用户控件Config中获取UploadPath,然后进行组合这样组合出来的路径就是:/Upload/News/201012

这样就完成了fckeditor上传文件路径分类配置了,目的是达到了,不过还有个瑕疵就是如果要新增一种路径则需要网站中新增一个 fckeditor的HTML包,在其中的fckeditor\editor\filemanager\connectors\aspx \config.ascx控件中修改一下UploadPath配置,如果各位还有其他解决办法欢迎分享!

源码下载:点我下载(直接浏览网站根目录下Default.aspx既可)

项目过程中所遇到的各种问题记录

编辑器篇:

FCKeditor相关知识及各种常见使用问题

FCKeditor自定义上传路径配置

[转载]IE中jQuery.fn.text, jQuerey.fn.val 和 dom.innerText, dom.value 的换行与tab问题

mikel阅读(1116)

[转载]IE中jQuery.fn.text, jQuerey.fn.val 和 dom.innerText, dom.value 的换行与tab问题 – 疯子阿飞 – 博客园.

最近使用JQuery的过程中发现关于.text, .val 和dom自身的.innerText, .value 在取值与赋值方面存在的差异.

以及IE7与IE8的pre标签的呈现差异(即white-space:pre).  现与大家分享一下.

在IE中, 对pre标签的文本取值与赋值, 可以使用$(“p”).text(“1\n2”), 亦可使用$(“p”)[0].innerText = “1\n2”;

不知道大家是否知道, 这两种方式的取值与赋值得到的结果, 产生的效果是存在差异的.

换行符

看过JQuery-1.4.4的代码以后发现, 在最新版本的jQuery中, text取值使用的是获得最基础的textNode的nodeValue, 也就是说, text取值和innerText取值的差异在于 nodeValue和innerText的差异:

对网页自身代码的取值 text() 返回的是1个字符char(13) 即 “\r”,  innerText 返回的是2个字符char(13)+char(10) 即 “\r\n”.

这里有一个诡异的问题:

当网页代码中包含一个自然换行时, text()可以取出这个换行符, 但是如果使用 innerText = innerText 赋值以后, 页面呈现没有发生任何变化, 但此时再用text()取值, 将无法得到换行符. 而使用text(text)的方式赋值后, 使用text()则可以得到换行符.

赋值呈现

1. innerText使用\r或者\n都可以产生换行效果, 但在IE8中, 连续的\r和\n会被合并为一个换行效果(这跟正统的对回车符与换行符的理解相符). 但在IE7中, 无论\r与\n如何组合, 都无法产生连续换行的效果.

并且, 使用innerText产生的换行只能单向的, 也就是说, 只能产生换行效果, 这个换行符却无法再次通过JavaScript捕捉到(无论innerText还是text).

2. text在IE8中, 回车符\r和换行符\n产生同等的效果换行效果, 不会被合并, 并且可以被JavaScript捕捉到. 不同的是innerText对独立的\n捕捉到的是\n, 对\r\n捕捉到的是\r\n, 对独立的\r捕捉到的也是\r\n.

这里就会产生一个问题, 标准换行应该是两个字符\r\n, 但是如果使用jQuery将这个字符串呈现在pre中, 则会产生两个换行效果(IE8). 在IE7中, \n会变成一个空格的效果.

制表符(\t)

text方法的赋值和取值在处理制表符的时候都没有问题, 而innerText在赋值的时候则无法进行\t的赋值, 这个赋值的呈现效果将变成一个空格.再次使用innerText取回也会发现那个\t变成了char(32), 而使用text取回这个\t则会诡异得变成char(160)这么一个奇怪的值.

使用text还是innerText

在呈现数据的时候, 究竟使用text还是innerText, 这取决于你数据库中的换行是\r, \n还是\r\n.

值得提醒的是, 在自然提交的表单中, 表单域中的换行符是正统换行, 即每个换行(效果)提交后都是完整的两个字符\r\n.

另外还需要提醒各位的是, 虽然表单域在正常提交的情况下换行是\r\n, 但如果你是通过ajax提交的, 那么换行就变成\n了

因为.val()取值时, 会自动过滤掉\r字符.

是不是看晕乎了, 我自己也很晕乎, 不过动动手, 去测试几个数据就会大概的明了了.

[转载]Android GPS 定位的实现(1)

mikel阅读(968)

[转载]Android GPS 定位的实现(1) – 彬彬的博客 – 博客园.

今天弄了一个多小时,写了一个GPS获取地理位置代码的小例子,包括参考了网上的一些代码,并且对代码进行了一些修改,希望对大家的帮助。具体代码如下:  要实用Adnroid平台的GPS设备,首先需要添加上权限,所以需要添加如下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

具体实现代码如下:

首先判断GPS模块是否存在或者是开启:

代码

private void openGPSSettings() { LocationManager alm = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); if (alm .isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT) .show(); return; } Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); startActivityForResult(intent,0); //此为设置完成后返回到获取界面 }

如果开启正常,则会直接进入到显示页面,如果开启不正常,则会进行到GPS设置页面:

获取代码如下:

代码

private void getLocation() { // 获取位置管理服务 LocationManager locationManager; String serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager) this.getSystemService(serviceName); // 查找到服务信息 Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度 criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗 String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息 Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置 updateToNewLocation(location); // 设置监听器,自动更新的最小时间为间隔N秒(1秒为1*1000,这样写主要为了方便)或最小位移变化超过N米 locationManager.requestLocationUpdates(provider, 100 * 1000, 500, locationListener);
}

到这里就可以获取到地理位置信息了,但是还是要显示出来,那么就用下面的方法进行显示:

代码

private void updateToNewLocation(Location location) { TextView tv1; tv1 = (TextView) this.findViewById(R.id.tv1); if (location != null) { double latitude = location.getLatitude(); double longitude= location.getLongitude(); tv1.setText("维度:" + latitude+ "\n经度" + longitude); } else { tv1.setText("无法获取地理信息"); } }

这样子就能获取到当前使用者所在的地理位置了,至少如何下地图上实现,在下面将进行获取,并显示出来!对参考代码的人表示感谢!

[转载]闲语ASP.NET MVC3和Razor

mikel阅读(1283)

[转载]闲语MVC3和Razor – 阿不 – 博客园.

原本没有这篇博客,直到看到ScottGu的这篇文章ASP.NET MVC 3: Razor’s @: and <text> syntax。我才决定,把我这几天对MVC3和Razor的一些观点记录一下。

关于Razor

因 为最近我身边的朋友和博客的博友,似乎对MVC3和Razor没有什么好感,甚至于认为微软开发Razor是走在另一条错误的路上。虽然我也没有在项目中 实际用到Razor,但是一直以来都还是挺关注Razor的进展,对它的语法也是了解一二,总体感觉就是更为干净和流畅了,其它的并没有更深的认识。晚上 在看ScottGu文章的时候,一段代码片段立即吸引了我:

你知道这段代码哪里吸引了我吗?没错,就是C#代码与html结合的非常流畅,(特别是它在花括号的处理上面,真的是让我眼睛一亮,因为目前最讨有花括号的ASPX代码了),相应的ASPX语法是这样的:

ASPX-smaple1

从两个代码片段对应,至少两点非常吸引我:

  1. ASPX 的语法,一句完整的foreach代码片段,被人为的拆分了几个不同的代码段。在书写上,我们可以通过Code Snippet来快速生成foreach代码格式,但是由于ASPX的语法问题,我们需要不断的去移动光标位置来把花括号拆分出来,在中间才放要输出的 HTML代码。在阅读上,我不得不去用第三只眼睛来数<%%>(其实我没有,只能让原本的两只多承担一点)。
  2. 不知道你注意到了没有,属于相同代码块的C#代码都会以高亮的方式显示。而在ASPX代码中,我们一眼是无法很好的区分哪些代码块是相关。

其实从这两代码我已经能够想像到,当我们的代码里面,出现了几层嵌套时的它们各自的场景了。由于ASPX是目前主要(几乎是唯一)的一种模板引擎,我已经几乎习惯,要睁大眼睛去匹配花括号对应关系的情况了,特别是当我们的代码超过一屏时,那真是一种享受啊。

在 读完ScottGu的整篇文章之后,自己做了几个新手实验之后,我大概明白了Razor的大概做法了。Razor在处理C#代码时,从以@开头的代码片段 开始(if..else, for,foreach,或是空语句@{}代码块)等语句,从{开始,到对应的}结束,在这个区域内都是可以写C#代码的区域,我们可以写任何的C#代 码,而不需要再有任何额外的标识,直到我们再次碰到:

  1. @(这时的@是用可以用于输出C#变量或属性值)。
  2. @:用于输出静态字符串。
  3. Html标签会直接输出,Html标签内的区域不属于C#代码区域,不可以写C#代码,里面的文件会直接输出,输出属性需要用@。
  4. text文本块,text文本块也是以html标签的形式存在,但它不是标准的html标签,只是它会被Razor特殊处理,只输出text里面的文本,而它自身的标签并不会被输出。这对于我们需要输出多行文本时可能会非常有用。

这 里,我还想特别说明一点。我不知道大家是否有遇到,在ASPX里面,如果我要给标签的属性绑定C#变量时,我在里面就无法使用代码提示了。我经常都是要到 外头去写好一段代码,然后复制进去。这让我非常痛苦,即使我手工也可以写完那段代码。请原谅我的水平低下,我真的不是那种可以完全用notepad就可以 写程序的程序员。如果你跟我有一样的痛苦的话,Razor将会给你带来惊喜,看看真相如何:

intellisense-tag-attribute

@是Razor的灵魂,所有的语法都是以@开头或结束,@using、@model、@**@、@: 。我目前知道的就这些了,但是不难想象,Razor的一切都会比ASPX来的简单,虽然@**@看着没有比<%– –%>强多少,但也还是比较有个性的 微笑。甚至连Razor文件的图标都是@符号。

至 于模板的性质,Razor本身还是以服务器代码驱动的,而不是限制性的标记性语法。在View当中可以写任何代码,安全性方面确实需要考虑,但是从灵活性 来讲,我相信还是有很多程序员离不开自由模板的,虽然限制性模板也可以达到相同的目的。我一直在想,有没有办法可以单独限制View中的代码的访问权限, 类似于trust level,只是这个trust level是用来限制模板中的代码。

关于MVC3

关于 MVC3,我个人不否认我的跟进态度有点激进,以至于在会影响其它项目的情况下还是升级到MVC3 R2。其实在R1出来的时候,我就尝试过升级,但是由于一个很难绕过的Bug而放弃。原本是没有那么强烈的意愿升级到MVC3 R2,只是周一那天,同事在介绍MVC3的时候,提到的unobtrusive js,突然让我想到,我是否可以利用这个特性来突破我们那天遇到的难题。在那天前的博客当 中,我还专门提到,当时还不大喜欢unobtrusive js的方式,时间刚过一周,我现在是非常的喜欢了unobtrusive js,用起来真的很干净,也很顺手,排错也非常方便。虽然很多人会说unobtrusive js不是微软发明的,但是想说,通过服务器端的ModelMetadata和客户端的unobtrusive js,真的可以让一切都简单很多,而且是不带性能损失并且可以改善架构的简单。

关于MVC,现在已经到第三版本了。作为一位从beta版 就开始跟踪,并用于实际项目开发的开发人员来说,我对MVC的了解,虽然没有像@Jeffery Zhao那么深入,相对来讲,对MVC的整个框架来算是比较熟悉的。我现在也真正体会到,微软的产品(或者是任何一家公司的产品),从第三个版本开始才会 真正成熟好用。虽然我有点同意这种论调,但是不可否认的是,MVC项目走的是一种社区式,开放式的开发路线。ASP.NET Team从一开始就通过大量的CTP,Beta,RC版本的方式来得到社区的的意见,这点真的非常好,也让产品做的更好用。我虽然没有直接做过什么贡献, 但是我还是从这些版本的更迭当时,学到了更多,也学的更快。

MVC1的时候,还是大量的把MVC1当成Json Service,几乎95%的Controller/Action都是返回Json对象,而在涉及视图的代码中,我还习惯性的使用了WebForm的手 法,用户控件,页面基类,服务器控件,几乎无所不用。不过,即使我用当时的MVC框架的方式来完成一个标准Web开发流程,现在看来,也可能是相当可怜。

MVC2 在加入了ModelMetadata之后,让MVC框架更上一层楼了,结合Html.XXXFor,DataAnnotation之后,让我们在表单生 成,数据绑定,数据验证方面更加的顺风顺水。有了ModelMetadata的MVC之后,MVC框架进入了另一个阶段了。微笑

相 对而言,我觉得MVC3,只是在MVC2基础之上,再结合.NET 4的一些“中看”特性而继续完善。但是它需要.NET4的要求,除了dynamic特性,无法在.NET 3.5中使用以外,其它的特性我们当然都可以单独提取一个基本.NET 3.5的MVC3出来。而且,其实不要被骗了,ViewBag真的不是特别常用的,或者说不是特别好用。

关于MVC3,最后我还想说,我真的很喜欢。关于Razor,我很期待。

[转载]AderTemplate模版引擎使用分析(二)

mikel阅读(1245)

[转载]AderTemplate模版引擎使用分析(二) – waemz – 博客园.

Ver2.1还添加了以下操作符:
is – 和调用equal方法相同. Ex: #obj1 is obj2# 会返回if obj1 equal obj2
isnot – 和调用notequal方法相同. Ex: #obj1 isnot obj2#
and – 相当于C#中的&&操作符
or – 相当于C#中的||
lt, lte, gt, gte – lt(less than,即C#中的”<“), lte(less than or equal,即c#中的”<=”), gt(greater than 即c#中的”>”) and gte(greater than or equal,c#中的”>=”). 当使用数字类型操作时,必须是相同的类型.如果希望比较double和int类型,必须将int转换为double类型(使用cdouble函数).

#varOne lt 3#
#varTwo lte cdbl(3)#
#varThree gt varFour and varFive gte 5.0#

Built In Tags(内置标签???):
IF
你可以使用IF根据表达式有条件的输出文本:

<ad:if test=”#booleanexpression#”>

<ad:elseif test=”#bool#”>

<ad:else>

</ad:if>

elseif和else是可选的,当if运算返回真的时候,if代码块中包含的代码将被执行(输出);否则执行elseif运算,然后是else.
Ex:

<ad:if test=”#cust.country is “CHINA“#”>
You are CHINA customer.
<ad:else>
You are from: #cust.country# country.
</ad:if>

如果cust.country是CHINA的话,输出:you are CHINA customer.

FOREACH
你可以使用foreach对集合内的元素进行循环遍历.

<ad:foreach collection=”#collection#” var=”cust” index=”i”>
#i#: #cust.lastname#, #cust.firstname#
</ad:foreach>

假设customers是customer的集合:customers = Customer(“Tom”, “Jackson”), Customer(“Mary”, “Foo”)
输出将是:
1. Jackson, Tom
2. Foo, Mary
在循环处理中,变量名称将被集合中的元素替换.foreach中的index属性可以省略,它被用来在循环中表示循环标志.开始于1并在每次迭代中自动增加.

FOR
你可以通过一个整数标志来进行FOR循环:

<ad:for from=”1″ to=”10″ index=”i”>
#i#: #customers[i].name#
</ad:for>

SET
Set标签允许设值通过其他表达式:
<ad:set name=”var” value=”#someexpression#” />
当Set语句执行后,你可以象使用局部变量一样使用var.当存取复杂类型的对象的时候非常有用.
以下写法:

#customers[i].address.firstname#
#customers[i].address.lastname#
#customers[i].address.address1#

可以写成:

<ad:set name=”add” value=”#customers[i].address#” />
#add.firstname#
#add.lastname#
#add.address1#

Custom Templates(定制模版):
你可以在模版文件中创建自己可调用的的模版.使用Template标签来做:

<ad:template name=”ShowCustomer”>
#customer.lastname#, #customer.firstname#
</ad:template>

<ad:showcustomer customer=”#cust#” />

你可以为自定义的模版添加任何属性,然后就可以在模版中使用他们.自定义模版也可以使用在它之外定义的任何变量,当调用自定义模版的时候必须在最后加上/或者加关闭标签
Ex:
<ad:showcustomer />
OR
<ad:showcustomer></ad:showcustomer>

Ex:

<ad:template name=”bold”>
<b>#innerText#</b>
</ad:template>

<ad:bold>#cust.lastname#, #cust.firstname#</ad:bold>

输出: <b>Jackson, Tom</b> (if customer is Tom Jackson)
模版可以嵌套使用:

<ad:template name=”italic”>#innerText#</ad:template>

<ad:bold><ad:italic>This will be bold and italic</ad:italic></ad:bold>

模版可以嵌套定义:

<ad:template name=”doit”>
<ad:template name=”colorme”>
<font color=#color#>#innerText#</font>
</ad:template>

<ad:colorme color=”blue”>colorize me</ad:colorme>
</ad:template>

嵌套定义的模版只能在按照定义顺序在父模版中使用.
也可以在程序中定义模版:

TemplateManager mngr = ;
mngr.AddTemplate(Template.FromString(
bold, <b>#innerText#</b>));

现在bold模版可以在以后使用了.

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)

[转载]AderTemplate模版引擎使用分析

mikel阅读(1110)

[转载]AderTemplate模版引擎使用分析 – waemz – 博客园.

AderTemplate只能运行于.NET2.0之上.
这里有一个简单例子:

Thank You for your order #order.billFirstName# #order.billLastName#.
<br>
Your Order Total is: #format(order.total, “C”)#
<br>
<ad:if test=”#order.shipcountry isnot “US”#”>
Your order will arrive in 2-3 weeks
<ad:else>
Your order will arrive in 5-7 days
</ad:if>

模版文件可以含有表达式,if/elseif/else语句,foreach/for/set语句和其他模版文件.

Templates API:在模版引擎中有两个主要的类:
Template和TemplateManager.
Template含有一个简单的模版文件实例,TemplateManager被用来处理模版.

创建模版对象Template实例的方法是通过Template或者TemplateManager的静态方法:

Template template = Template.FromString(string name, string data)
Template template
= Template.FromFile(string name, string filename)

然后可以用它来实例化TemplateManager:

TemplateManager mngr = new TemplateManager(template);

或者可以这么做:

TemplateManager mngr = TemplateManager.FromFile(filename);
TemplateManager mngr
= TemplateManager.FromString(template);

使用FromString方法,参数string template可以包含模版代码.这个方法可以在没有模版文件的情况下,从动态生成的文本创建TemplateManager.

可以使用SetValue(string name, object value);来处理模版文件中的标签.
Ex:

mngr.SetValue(customer, new Customer(Tom, Jackson));

这样就可以在模版中使用customer标签,你可以使用任何类型的对象来替换标签,当变量的值被output的时候,ToString()方法会被调用.

– Expressions 表达式(标签,应该这么理解把)
在模版文件中标签是以#包起来的字符串:
#FirstName#

这个例子会输出first name的值.如果要输出#,只要连写两个#即可.
Ex:
Your SS## is #ssnumber#

使用标签你可以输出任何变量(对象):
#somevar#
输出对象的一个属性或字段:
#somestring.Length#
属性名称不区分大小写,所以你可以:#string.length# or #string.LENGTH#
或者调用一个函数:#trim(somename)#
#customer.firstname.length#
你可以调用任何对象的方法:
#firstname.substring(0, 5)# 或者 #customer.isValid()#

Ver2.1允许你调用指定下标的Array项:
#somearray[3]# – 得到Array的第三项
#hastable[“somekey”]# – 得到somekey的值从hashtable.

有一些现成的函数和很方便就能添加的函数,这些函数是:
equals(obj1, obj2) – 检查obj1和obj2是否相等,返回boolean真假
notequals(obj1, obj2) – 返回!equals(obj1, obj2). 相当于调用: not(equals(obj1, obj2))
iseven(num) – tests whether number is an even number
isodd(num) – tests whether number is an odd number
isempty(string) – 测试字符串是否为空. 和equals(string.Length, 0)相同
isnotempty(string) – 测试字符串是否含有至少1个字符
isnumber(num) – 测试num是否为数字格式
toupper(string) – 不说了
tolower(string) – 不说了
isdefined(varname) –  测试varname是否被定义
ifdefined(varname, value) – 如果varname被定义,那么返回value的值.例如:#ifdefined(“name”, name)# -如果name被定义的话,返回name的值,否则返回nothing.
len(string) – 返回字符串的长度.
tolist(collection, property, delim) -以delim为分隔符,把collection转化为字符串.prototype是collection的某个属性,如果prototype不为空,将返回以delim分隔的该属性的值.如果没有prototype,collection将被使用.
Ex:
假设list如下:

ArrayList list = new ArrayList();
list.Add(
one);
list.Add(
two);
list.Add(
three);
template.SetValue(
mylist, list);

那可以在模版中这样写:#toList(mylist, ” & “)#
最后的输出将是:one & two & three

假设list如下:

list.Add(new Customer(Tom, Whatever));
list.Add(
new Customer(Henry, III));
list.Add(
new Customer(Tom, Jackson));
template.SetValue(
mylist, list);

在模版中:#toList(mylist, “firstName”, “,”)#
最后的输出将是:Tom,Henry,Tom

isnull(obj) – 测试对象是否为null
not(boolvalue) – -_-不说了
iif(booleanExpression, iftruevalue, iffalsevalue) – 和C#中的三元表达式一样: booleanExpression ? iftruevalue : iffalsevalue
Ex:
#iif(isodd(i), “bgcolor=yellow”, “bgcolor=red”)#
will output bgcolor=yellow if i is odd number and bgcolor=red if i is not odd number

format(object, formatstring) – 将会调用object的ToString(formatstring).
Ex:
(如果total是货币型1208.45)
#format(total, “C”)#
会输出: $1,208.45
trim(string) – 略
filter(collection, booleanproperty) – will return new List from collection for those objects whose booleanproperty property evaluates to true

gt(obj1, obj2) – 如果obj1>obj2返回true.obj1和obj2必须继承于相同的类型.
lt(obj1, obj2) – 如果obj1<obj2返回true.obj1和obj2必须继承于相同的类型.
compare(obj1, obj2) – 如果obj1<obj2,返回-1;如果obj1==obj2,返回0,如果obj1>obj2返回1.obj1和obj2必须继承于相同的类型.
or(bool1, bool2) – 如果bool1为真或bool2为真,返回真
ex:
#or(equals(state, “IL”), equals(state, “NY”))# – 如果state==”IL”或者state==”NY”返回真
and(bool1, bool2) – 不罗嗦了
comparenocase(string1, string2) – will do case insenstive comparison of string1 and string2 and return true if they are equal
stripnewlines(string) – 在string后换行
typeof(object) – Ex: typeof(“hello”) return “string”. typeof(3) returns int
cint(value) – 调用Convert.ToInt32 from .net library
cdouble(value) – 转换为double类型
cdate(value) – 转换为datetime类型.Ex: #cdate(“2005-5-1”)#
createtypereference(type) – Ex:

#createtypereference(“System.Math”).Round(3.39789)#
#createtypereference(“System.Math”).PI#
or
<ad:set name=”MyMath” value=”#createtypereference(“System.Math”)#” />
#MyMath.Round(3.3)#
#MyMath.PI#

(未完,等续)

AderTemplate官方网站:http://www.adersoftware.com
AderTemplate dll下载地址:http://www.aspxon.com/ShowSoft/15.aspx
AderTemplate源码下载地址(含有演示):AderTemplate(dll)模版引擎(c#源码)

[转载]9款最具代表性的 jQuery 幻灯片效果

mikel阅读(1003)

[转载](转)9款最具代表性的 jQuery 幻灯片效果 – 豪情 – 博客园.

原文来自:http://www.sunflowamedia.com/blog/index.php/web-design-blog/9-jquery-slides/

使用JQuery的幻灯片效果变得非常受欢迎,我整理出比较具有代表性的几款分享给大家,有些还提供功能下载,让我们一起来看看吧。

1. Nivo

Nivo
http://nivo.dev7studios.com/

2. Slidesjs

Slidesjs
http://www.slidesjs.com/

3. Hevoq

Hevoq
http://www.davidmassiani.com/horinaja/index.php

4. jqfancytransitions

jqfancytransitions
http://www.zurb.com/playground/orbit-jquery-image-slider

5. Orbit

Orbit
http://www.zurb.com/playground/orbit-jquery-image-slider

6. Animate Panning

Animate Panning
http://buildinternet.com/2010/02/animate-panning-slideshow-with-jquery/

7. quicksand

quicksand
http://razorjack.net/quicksand/

8. viewbook

viewbook
http://builtbywill.com/code/viewbook/

9. Slide Deck

Slide Deck
http://www.slidedeck.com/?utm_source=Themeflash&utm_medium=banner&utm_campaign=SlideDeck%2BDisplay

[转载]C#反射调用方法-InvokeMember

mikel阅读(1429)

[转载]反射发送实战-InvokeMember – chinafine – 博客园.

[转载]通过javascript获得url参数

mikel阅读(1009)

[转载]通过javascript获得url参数 – 永远的梦魇 – 博客园.

页面提交数据一般有两种方法:get,post。post就是所谓的form提交,使用视图;get是通过url提交。

Get方法一般用后台代码(如asp,ASP.NET)获得参数,代码很简单:Request.QueryString[“id”];即可获取。

有些时候需要直接在前台获取url参数,要用到JavaScript,js没有直接获取url参数的方法,那么,我们如何通过js获取url参数呢?

function GetUrlParms()
{
var args=new Object();
var query=location.search.substring(1);//获取查询串
var pairs=query.split(“&”);//在逗号处断开
for(var   i=0;i
<pairs.length;i++)
{
var pos
=pairs[i].indexOf(‘=’);//查找name=value
if(pos==-1) continue;//如果没有找到就跳过
var argname
=pairs[i].substring(0,pos);//提取name
var value=pairs[i].substring(pos+1);//提取value
args[argname]=unescape(value);//存为属性
}
return args;
}

使用方法:
var args = new Object();
args = GetUrlParms();
如果要查找参数key:
value = args[key]

[转载]Android 简单的照相机程序

mikel阅读(960)

[转载]Android 简单的照相机程序 – 彬彬的博客 – 博客园.

终于经过多次找错,修改把一个简单的照相机程序完成了,照相类代码如下:

代码

1 class surface extends SurfaceView implements SurfaceHolder.Callback { 2 3 SurfaceHolder sfholder; 4 5 Camera camera; 6 7 Bitmap bitmap; 8 9 public surface(Context context) { 10 super(context); 11 // TODO Auto-generated constructor stub 12   13 sfholder = getHolder(); 14 sfholder.addCallback(this); 15 sfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 16 } 17 18 public void surfaceChanged(SurfaceHolder holder, int format, int width, 19 int height) { 20 // TODO Auto-generated method stub 21   Camera.Parameters parameters = camera.getParameters(); 22 parameters.setPictureFormat(PixelFormat.JPEG); 23 parameters.setPreviewSize(320, 480); 24 parameters.setPictureSize(320, 480); 25 camera.setParameters(parameters); 26 camera.startPreview(); 27 } 28 29 public void surfaceCreated(SurfaceHolder holder) { 30 // TODO Auto-generated method stub 31   32 try { 33 camera = Camera.open(); 34 camera.setPreviewDisplay(sfholder); 35 } catch (Exception e) { 36 camera.release(); 37 camera = null; 38 } 39 } 40 41 public void surfaceDestroyed(SurfaceHolder holder) { 42 // TODO Auto-generated method stub 43   camera.stopPreview(); 44 camera = null; 45 46 } 47 //拍照 48 public void takePicture() 49 { 50 if (camera != null) 51 { 52 camera.takePicture(null, null, jpegCallback); 53 } 54 } 55 56 //拍照并且保存的回调函数 57   58 private PictureCallback jpegCallback = new PictureCallback() { 59 60 public void onPictureTaken(byte[] data, Camera camera) { 61 // TODO Auto-generated method stub 62 try 63 { 64 bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 65 File file = new File("/sdcard/camera1.jpg"); 66 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); 67 bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos); 68 bos.flush(); 69 bos.close(); 70 Canvas canvas= sfholder.lockCanvas(); 71 canvas.drawBitmap(bitmap, 0,0, null); 72 sfholder.unlockCanvasAndPost(canvas); 73 } 74 catch(Exception e) 75 { 76 e.printStackTrace(); 77 } 78 } 79 } 80 }

这个是一个拍照的类,使用的是SurfaceView来实现的,如果想要在一部分上显示,并且使用按钮操作的话,可以修改一下这个类,而且这个是拍照之后停留在拍照页面的,如果需要在拍照后不停留在拍照页面的,可以自行修改和添加参数。

此程序也演示了,如何在拍完照之后,将照片保存到SD卡上。

实际使用时的操作如何,使用的是按键进行拍照的,其实也可以改为使用按钮进行拍照的,只要对这个类进行简单的修改即可。调用如下:

代码

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) sf.takePicture(); return super.onKeyDown(keyCode, event); }

要使用相机和操作SD卡,则需要添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.CAMERA"></uses-permission>

第一条是可以使用扩展存储设备的权限

第二条是可以使用照相机设备

如果没有这两条权限的话,会报错,具体错误可以在DDMS中查看 。欢迎交流!

希望对大家有所帮助 !

此平台使用提Android2.2 V8的系统,如果使用1.5或者是其它的,权限可能会不一样!

当然更好的方法是首先检查SD卡是否存在,此程序中没有进行检测,因为我只是在练习相机的使用。

检测代码如下:

代码

if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { File sdcardPath = Environment.getExternalStorageDirectory(); setTitle(sdcardPath.getName()); //将SD卡路径名字设置为标题,只是为了让大家看的更明白些 } else { Toast.makeText(RecordTest.this, "没有SD卡", 1000).show(); }