博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Razor Templating Engine
阅读量:6150 次
发布时间:2019-06-21

本文共 2248 字,大约阅读时间需要 7 分钟。

       最近遇到html模板解析,我完全可以用MS的T4模板或者是StringTemplate等其他的模板来做,但是出于尝试和对Razor语发的感兴趣,便翻了翻Razor模板的资料,其CodePlex主页。

      下面讲的都是一些其主页上面的例子,所以请大家别拍砖。别后面想到有些实际意义的例子在写个具体的运用例子吧。

ExpandedBlockStart.gif
代码
public
 
static
 
class
 Razor 
    
public
 
static
 
string
 Parse(
string
 template, 
string
 name 
=
 
null
); 
    
public
 
static
 
string
 Parse
<
T
>
(
string
 template, T model, 
string
 name 
=
 
null
); 
    
public
 
static
 
void
 SetLanguageProvider(ILanguageProvider provider); 
    
public
 
static
 
void
 SetMarkupParser(MarkupParser parser); 
    
public
 
static
 
void
 SetTemplateBaseType(Type type); 
}

 

在Razor这个静态类中最重要的方法当然是我们的Parse方法了,其有两个重载,在第二个重载在我们可以传入Template的Model,了解asp.net mvc都会知道这个Model。同时我们可以用SetLanguageProvider方法传入LanguageProvider(C#、VB)等,SetTemplateBaseType传入模板BaseType(可能是我们的自定义类型)。

1:先来个简单的Template:

ExpandedBlockStart.gif
代码
static
 
void
 Main(
string
[] args) 
       { 
           
string
 template 
=
 
"
Hello @Model.Name! Welcome to Razor!
"
           
string
 result 
=
 Razor.Parse(template, 
new
 { Name 
=
 
"
World
"
 });         
           Console.WriteLine(result); 
           Console.Read(); 
       } 

 

 

输出结果:

Hello World! Welcome to Razor!

在这里我们传入的是new { Name = "World" }的匿名对象的Model。

2:内部嵌套方法:

 

string
 template 
=
 
@"
@helper MyMethod(string name) {
Hello @name
}
@MyMethod(Model.Name)! Welcome to Razor!
"
string
 result 
=
 Razor.Parse(template, 
new
 { Name 
=
 
"
World
"
 }); 

 

输出同样是上边的结果,但是注意这里的与上面不同的是在{}中间的空格等是不会忽略的。我的理解是同样是一个模板的形式吧。

3:传递模板参数:

在传递参数的情况下我们可以采用自定义类,继承至TemplateBase 或者TemplateBase<T>,后者是带Model的情形。

还是官方的例子来看看,

ExpandedBlockStart.gif
代码
static
 
void
 Main(
string
[] args) 
    { 
        Razor.SetTemplateBaseType(
typeof
(MyCustomTemplateBase
<>
));
        
string
 template 
=
 
"
My name in UPPER CASE is: @ToUpperCase(Model.Name)
"
        
string
 result 
=
 Razor.Parse(template, 
new
 { Name 
=
 
"
Matt
"
 });
        Console.WriteLine(result); 
        Console.Read(); 
    } 
public
 
abstract
 
class
 MyCustomTemplateBase
<
T
>
 : TemplateBase
<
T
>
 
    
public
 
string
 ToUpperCase(
string
 name) 
    { 
        
return
 name.ToUpper(); 
    } 

 

输出结果为:My name in UPPER CASE is: MATT。

在我们的MyCustomTemplateBase<T>抽象类中我们可以像MVC一样定义一些辅助属性和方法,像html、Request、Response等辅助类等

有事我们需要自定义一些非modle的非static property给Template,我的考虑是在TemplateService 中的重写Parse方法中初始化Action:

public string Parse<T>(string template, T model, string name = null,Action<ITemplate<dynamic>> initAction);

作者: 
出处: 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-、和。http://www.cnblogs.com/whitewolf/archive/2010/12/22/1913718.html

你可能感兴趣的文章
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
vb sendmessage 详解1
查看>>
jquery用法大全
查看>>
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>