最近关注一下asp.net的模板引擎,在网上看介绍有不少的模板引擎,其中一个是NVelocity模板引擎,挺不错的,也测试过一下,于是在网上有人做二次封装来调用。来看下吧。
先看代码:
BaseHandler.cs
Code [http://www.xueit.com]
using System;
using System.IO;
using System.Web;
using System.Text;
using System.Collections;
using NVelocity;
using NVelocity.App;
using NVelocity.Context;
using NVelocity.Runtime;
using Commons.Collections;
namespace AspNet.App.UI
{
public abstract class BaseHandler : IHttpHandler
{
private static readonly VelocityEngine viewEngine = new VelocityEngine();
static BaseHandler()
{
//TODO:这里的硬编码可以改成配置文件的方式
ExtendedProperties extend = new ExtendedProperties();
extend.AddProperty(RuntimeConstants.COUNTER_NAME, "i");
extend.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
extend.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
extend.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
string appPath = AppDomain.CurrentDomain.BaseDirectory;
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, appPath);
//模板的缓存设置
extend.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true); //是否缓存
extend.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30); //缓存时间(秒)
viewEngine.Init(extend);
}
public HttpContext HttpContext
{
get;
private set;
}
public HttpRequest Request
{
get;
private set;
}
public HttpResponse Response
{
get;
private set;
}
private Hashtable templateData = new Hashtable();
public Hashtable TemplateData
{
get { return templateData; }
}
private string templateFile = string.Empty;
public string TemplateFile
{
get { return templateFile; }
set { templateFile = value; }
}
public void ProcessRequest(HttpContext context)
{
this.HttpContext = context;
this.Request = context.Request;
this.Response = context.Response;
//此方法主要进行数据的获取
Handler_Load(this, EventArgs.Empty);
//输出
IContext ctx = new VelocityContext(templateData);
viewEngine.MergeTemplate(TemplateFile, "utf-8", ctx, context.Response.Output);
}
//局部文件的呈现
protected string Merge(Hashtable data, string fileName)
{
IContext ctx = new VelocityContext(data);
StringBuilder sb = new StringBuilder(512);
StringWriter writer = new StringWriter(sb);
viewEngine.MergeTemplate(fileName, "utf-8", ctx, writer);
return sb.ToString();
}
public abstract void Handler_Load(object sender, EventArgs e);
public bool IsReusable
{
get { return false; }
}
}
}
下面给出具体的应用
为实现Master效果
对上面的代码进行2次封装:
2次封装:
Code [http://www.xueit.com]
using System;
using System.Data;
using AspNet.App.UI;
namespace AspNet.Web.User
{
public abstract class UserMasterHandler : BaseHandler
{
public override void Handler_Load(object sender, EventArgs e)
{
//这里的数据主要是为了呈现Master配置文件的
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");
for (int i = 1; i <= 10; i )
{
DataRow dr = dt.NewRow();
dr["id"] = i.ToString("D2");
dr["name"] = "测试名字" i.ToString("D2");
dt.Rows.Add(dr);
}
this.TemplateData.Add("dt", dt);
this.TemplateData.Add("title", get_Title());
this.TemplateData.Add("centerHtml", get_CenterHtml());
this.TemplateFile = ViewPath("/user/userMaster.htm");
}
public abstract string get_Title();//为子文件必须实现的方法,子文件可以不关心Master文件中到底有什么标记或有多少标记,只需要实现了Master的所有abstract方法即可
public abstract string get_CenterHtml();
}
}