Razor在语法上的确不错,用起来非常方便。除了在asp.net mvc中使用外其实我们可以通过使用这模板来完成其他方面的工作,如我们比较常用的代码生成输出。如果想用Razor来进行模板处理和输出信息等应用心下几点细节是需要注意的。
1)程序集和名称引用
2)编译错误提示处理
3)模板编写智能提示
以上几点主要是在基于Razor实现自有MVC组件所总结出来的,相信对那些想使用Razor进行应用处理的朋友有所帮助。如果想用Razor的朋友但又不了解的话可以到以下链接了解一下:http://www.west-wind.com/weblog/posts/2010/Dec/27/Hosting-the-Razor-Engine-for-Templating-in-NonWeb-Applications
程序集和名称引用
由于Razor解释模板后最终是会通过CodeDom来生成对应输出的静态对象,那对于引用的程集和模板对应引用的名称空间是比较重要,如果这两者处理不好的情况只会导致最终CodeDom编译错误。实际应用编写模板所涉及的程序是不固定的,所以也不可能预想地把对应的程序加进去;解决方法可以在CodeDom的时候得到当前应用域引用的所有程序集添加进去处理。
foreach (Assembly item in AppDomain.CurrentDomain.GetAssemblies()) { AddAssembly(item.Location); }
名称空间的引用对于编写模板应用的时候带来很大的便利性,虽然每个模板可以单独引用但显然不够一个地方引入来的方便。这问题的解决方法可以通过配置文件来配置得到。如果当前项目是web项目就简单点了,直接读取web配置的名称空间即可。
编译错误处理
在asp.net mvc中当编写Razor语法有错误的时候,在解释页面时都能明确显示那些地方编写错误。但自己制订Razor模板处理的时候可能没在关注这一点,这样存存在一个比较严重的问题就是当模板编译错误的情况,使用者很难知道具体错误的原因和地方。其实Razor已经提供了模板验证功能通过RazorTemplateEngine.ParseTemplate会对模板进行语法验证,并返回存在错误的信息和对应的错误位置。
由于Razor最终需要通过CodeDom来把模板编译成静态化,因此在编译过程也可能存在一些错误,而这些错误并不是Razor语法所导致的,有可能是方法不存或方法名不匹配引起;因此在静态编译层面出现的错误也应该能明确提示给使用者看.在代码中可以通过CompilerResults得到相应的编译错误信息,同样包括错误的信息和具体错误所在的行.
模板编写智能提示
其实VS已经对cshtml提供了智能提示功能,但对于不是MVC项目如传统的ASP.NET项目,WINFORM项目等.在编写cshtml名称空间引入就相对比麻烦,同样由于VS默认给cshtml提供了基础类型的指定,如果应用中Razor使用的是其他基类那无法针对相应基础类提示了.其实解决这个的问题比较简单只需要在项目中添加web.config文件(不管是asp.net,winform或类库),添加以下配置节即可.
<configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="Peanut.Razor.TemplateBase,Peanut"> <namespaces> <add namespace="Peanut" /> <add namespace="Peanut.Razor" /> <add namespace="Peanut.Html" /> </namespaces> </pages> </system.web.webPages.razor>
在namespaces中添你需要引入的名称空间即可,而模板的基础类通过pageBaseType指定即可.
以上是在使用razor构建自有MVC应用的时候总结出来的一些心得,希望对那此想使用razor做应用的同学有所帮助.不过还有一个比较重要的问题不能解决就是在模板里设置断点无法实现调试...