Razor引擎浅析所述,Razor的两大主要功能,模板文件和动态编译器。我们能不能单纯就要而且只要这俩主要特性?其它那些智能查找视图文件等,虽不能说是垃圾,也是束缚手脚的条条框框,我完全可以自己做,失去的是一条绳索,获得是整个世界。下面学步园小编来讲解下怎样使用Razor视图引擎名?
怎样使用Razor视图引擎名
首先,用到的Razor域名空间。
usingSystem.Web.Razor;
usingSystem.Web.Razor.Generator;
usingSystem.Web.Razor.Parser;
第一步,动态编译:解析视图文件,生成代码,是的,生成代码,先。Razor的语法可以说是私有语法,需要先生成标准代码,然后才编译,生成我们熟悉的C#类Type。需要注意的是,我下面代码用的模板基类是我自己的TeamplateBase,后面会给出简单实现,当然,好处就是灵活性。你也可以直接用Asp.NetMVC的System.Web.Mvc.WebViewPage,不过我没有试过,也许会有其他问题,不能保证。
publicstaticTypeCompile(stringtemplate_path)
{
//准备临时类名,读取模板文件和Razor代码生成器
varclass_name="c"+Guid.NewGuid().ToString("N");
varbase_type=typeof(TemplateBase<>).MakeGenericType(typeof(T));
vartemplate=File.ReadAllText(template_path);
varhost=newRazorEngineHost(newCSharpRazorCodeLanguage(),()=>
newHtmlMarkupParser())
{
DefaultBaseClass=base_type.FullName,
DefaultClassName=class_name,
DefaultNamespace="YourNameSpace.dynamic",
GeneratedClassContext=
newGeneratedClassContext("Execute","Write",
"WriteLiteral","WriteTo",
"WriteLiteralTo",
"YourNameSpace.TemplateBase")
};
host.NamespaceImports.Add("System");
host.NamespaceImports.Add("YourNameSpaces");
//生成代码
CodeCompileUnitcode;
using(varreader=newStringReader(template)){
vargeneratedCode=newRazorTemplateEngine(host).GenerateCode(reader);
code=generatedCode.GeneratedCode;
}
//准备编译参数
var@params=newCompilerParameters
{
IncludeDebugInformation=false,
TempFiles=newTempFileCollection(AppDomain.CurrentDomain
.DynamicDirectory),
CompilerOptions="/target:library/optimize",
GenerateInMemory=false
};
varassemblies=AppDomain.CurrentDomain
.GetAssemblies()
.Where(a=>!a.IsDynamic)
.Select(a=>a.Location)
.ToArray();
@params.ReferencedAssemblies.AddRange(assemblies);
//编译
varprovider=newCSharpCodeProvider();
varcompiled=provider.CompileAssemblyFromDom(@params,code);
if(compiled.Errors.Count>0){
varcompileErrors=string.Join("rn",compiled.Errors.Cast