Yzl的研究室

一切都是幻觉
 
 
昵称:yzlhccdec
园龄:4年
粉丝:1
关注:1

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

我的标签

  • LINQ(2)
  • 多表操作(1)
  • 分页(1)
  • 算法 ACM(1)
  • WPF SilverLight(1)
  • Linq Monorail(1)
  • SilverLight(1)
  • WPF(1)
  • Gzip(1)
  • Ajax(1)
  • 更多

随笔分类(8)

  • [.NET]LINQ To SQL(4) (rss)
  • [.NET]Performance && Optimization (rss)
  • [.NET]WPF/SilverLight(2) (rss)
  • [Web]Development(1) (rss)
  • Data Structures and Algorithms(1) (rss)
  • SQL Server (rss)

随笔档案(13)

  • 2008年10月 (1)
  • 2008年6月 (2)
  • 2008年3月 (10)

积分与排名

  • 积分 - 51871
  • 排名 - 2043

最新评论

阅读排行榜

评论排行榜

推荐排行榜


Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年10月20日

在Asp.Net MVC中使用NVelocity模板引擎(一)-自定义关键字

大约在很早很早的时候,我们就可以使用MvcContrib为我们的ASP.NET MVC程序引入NVelocity模板引擎的支持了。但是从严格意义上来说,这个支持仅仅是有限支持,因为大部分原本可以在Monorail里面使用的功 能都使用不了了,不仅如此,整个程序还有一大堆bug。总的来说,这个程序集堪称“超级杀脑细胞王3000”,让你用得绝望。百般无奈之下,只好自己修改 这个程序集,那么这篇文章就权当一个opening吧。

 

如果我们在Preview 5版本的MVC中使用诸如$html.renderaction或者$html.renderpartial这种返回值是void的方法时,我们会发现根 本没有效果。不过还好,这个bug已经在beta 1版本中解决了,但是…但是解决的方法并不怎么优雅…

先看看Preview 5的实现代码

 

这 里传进Render方法的writer实际上就是一个httpwriter,重点在处理layout那一段,如果有layout的话就把子 template,也就是代码中的_viewTemplate,解析之后放到内存流中间去缓存,然后把处理的结果赋给childContent变量,再让 父template解析一次,这样就完成了对整个页面的解析。但是如果使用这种方法的话,helper中所有返回值为void的渲染方法都会失效。因为在 Helper中所有返回值为void的方法都是调用HttpWriter把结果直接写进response.OutputStream中的。如果向上面那样 自己用一个StringWriter来缓存输出流的话,相当于所有返回值为void的helper方法都被剥离出了NVelocity的解析树(这种情况 下有2个流,一个是response.OutputStream,一个是StringWriter的Stream),结果当然会不正确啦。

 

所以在Beta 1的MvcContrib中,代码被改成了下面这样

 

这 里不再使用StringWriter去缓存流,而是直接使用writer来写入response.OutputStream中,由于在 context.Put中送入的是子template的名字(Preview 5是解析后的子template),所以我们在layout.vm中不能再像以前一样直接用$childContent来占位,而是要 用#parse($childContent),虽然改变了长期以来的使用习惯,但是好歹还是能够正常使用了,直到……

 

昨 天XX强烈要求我把#capturefor给弄出来(这个方法是monorail里面的,在ASP.NET MVC里面用不了),于是我把Monorail的源代码大致看了一下,发现其实#capturefor是monorail自定义的一条 directive(指令),也就是说NVelocity引擎是可以支持自定义Directive的。

 

首先定义一个继承自Directive的类

 

然后定义一个继承自DirectiveManager的类

 

并在RegisterCustomDirectives方法中注册,最后在NVelocityViewFactory中注册这个自定义的DirectiveManager类

 

运 行一下看看?囧…竟然没有将变量解析出来,不过至少在vm文件中使用#capturefor关键字不会报错了,也就是我们的Directive还是起作用 了。经过Debug发现问题其实还是出在最后的渲染步骤上。在template.merge的时候,NVelocity引擎会按照文档的顺序来解析模板并 将其输出到response.OutputStream中,而capturefor的参数一般是在父template中定义的,也就是说如果按照顺序解析 的话是绝对解析不出来的。但是如果按照Preview 5中那样先解析子template又会有另外的bug.

 

不过好在我们仍有办法解决这个问题。首先建立一个response filter,让它去截获response的输出流,不让这个流输出到客户端,而是存到我们自定义的一个变量中。然后,嘿嘿…看图,应该很明了了

 

还 是用HttpWriter来写结果,这样可以保证顺序问题和Void方法问题,但是并不把这个结果输出到客户端,而是放到一个字符变量中,然后我们再调用 父template的merge方法来完成解析。这样做不但解决了自定义directive的问题,而且我们现在也可以像以前那样在layout中使用 回$childContent方法而不是#parse($childContent)了。一举两得!

posted @ 2008-10-20 17:48 yzlhccdec 阅读(2659) 评论(7) 编辑
 

2008年6月17日

破解SQL Prompt 3.8..

累了累了,再也不搞了,按惯例1天后删除.
效果如下

破解包下载
说明附到里面了....

这里是破解过程
睡觉去.....

好像在中文OS下面会出问题,那个知道原因的望指教,小弟第一次用IL反编译工具,不晓得是不是跟OS语言版本有关系

posted @ 2008-06-17 06:16 yzlhccdec 阅读(3560) 评论(35) 编辑
 

2008年6月15日

Resharper 4.0出来了
下载地址:http://download.jetbrains.com/resharper/ReSharperSetup.4.0.msi
算号器下载(花了几个小时把它XXOO了,这是算号器,晚上就删了,请勿用于商业用途哟)(已删除
)
我VS 2008 SP1装了之后无法使用Resharper提供的Intellisense,不知道大家有没有这个问题?
posted @ 2008-06-15 11:25 yzlhccdec 阅读(5179) 评论(38) 编辑
 

2008年3月24日

Ajax缓存问题

今天把网站部署到服务器上之后,发现了以前在本机调试的时候从来没有出现过的问题:在我明明在Http请求头中强制设定了Cache-Control:no-store,但Ajax请求竟然还会缓存数据。
但是这个问题只出现在IE6上面。后来我发现服务器对动态文件也开启了Gzip,关掉之后问题立刻就解决了。
到Google上一搜,原来是IE6的BUG,残念.......
http://support.microsoft.com/kb/321722
看样子还得老老实实用伟大的随机数大法了。。。

posted @ 2008-03-24 21:09 yzlhccdec 阅读(285) 评论(1) 编辑
 

2008年3月21日

MonoRail和Linq To SQL的兼容性问题

今天无意中发现的一个兼容性问题。如果你使用了Monorail+Linq进行开发,这个问题很值得注意。
我在项目中使用Linq内置的OnXXXChanged/OnXXXChanging进行数据有效性验证,比如

partial void OnTopicChanging(string value)
      
{
            
if (!value.IsLengthIn(1, 100))
                
throw new DataException("主题不符合要求,请返回重新填写");
        }

然后在前台用SmartDispatcherController进行数据绑定,比如
public void Post([DataBind("article")]ArticleInfo articleInfo)
{}

然后我在Globle.ascx.cs中进行未处理异常的捕获

但奇怪的是,当OnTopicChanging中的异常发出后,Globle.ascx.cs竟然无法捕获。也就是说,如果你直接像我这样绑定数据并处理异常的话,是无法得到想要的结果的。
其实原因很简单,SmartDispatcherController在数据绑定的时候用了一个try catch,然后把绑定过程中发生的所有错误全部截获,并放到了BoundInstanceErrors中去了。
解决方法有两个:1.判断BoundInstanceErrors的Count并做相应处理;2.把OnTopicChanging中的验证移到OnValidate中去....
怨念啊~~~我不知道ASP.NET MVC是否存在类似的问题,有条件的朋友可以测试一下。

posted @ 2008-03-21 16:52 yzlhccdec 阅读(1940) 评论(2) 编辑
 

2008年3月20日

WPF性能校调
摘要: 声明:本文写于2007年4月8号,差不多一年前,之后我就没用过WPF了,不知道现在改了多少,麻烦大家自己筛选一下。一、Rendering Tier1. 根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tier 2的情况下也不会硬件加速。(不全,其余请查阅SDK)Bitmap effects, Printed...阅读全文
posted @ 2008-03-20 09:23 yzlhccdec 阅读(2942) 评论(1) 编辑
 
为WPF/SilverLight的学习者们打气
摘要: 最近园子里面学习WPF/SilverLight的同志们越来越多了,我把一年前做的WPF的一个Demo发上来,让还在犹豫要不要学的兄弟们看看,咱用WPF/SilverLight做效果也绝对不比Flash/Flex差,呵呵。http://www.cnblogs.com/Files/yzlhccdec/Debug.rar这里是源代码大家开发WPF/SilverLight的时候一定要用Blend!!!!V...阅读全文
posted @ 2008-03-20 01:47 yzlhccdec 阅读(4144) 评论(26) 编辑
 
.Net中Char的长度
摘要: 以前一直在c++中用Char表示一个字节的数据,今天刚发现在C#中Char是两个字节的。我倒。。。。阅读全文
posted @ 2008-03-20 00:50 yzlhccdec 阅读(355) 评论(0) 编辑
 

2008年3月16日

一个ACM在线提交系统,支持c#提交
摘要: 有时间还是学学算法吧,反正有好处就得了。http://www.spoj.pl 好不容易找到这个支持c#在线提交的题库阅读全文
posted @ 2008-03-16 18:13 yzlhccdec 阅读(391) 评论(1) 编辑
 

2008年3月13日

关于三层架构的一些疑问
摘要: 1.我们在设计网站的时候,经常有前台用于展现的实体和后台用于持久化的实体不完全相同的情况。比如星座这种数据,在后台存的可能是一个tinyint值,但是在前台显示的时候肯定要转成“某某座”这样,对于这种情况,我现在的处理方法是建立PO,VO两种对象,但现在有两个问题:1.VO、PO定义在哪?是分别定义到自己所属的层,不允许穿透?还是统一定义到Model层里面去?2.VO<...阅读全文
posted @ 2008-03-13 02:19 yzlhccdec 阅读(8903) 评论(66) 编辑
 
仅列出标题  下一页