我将NVelocity 简单封装了一下,如下:
public static string NRenderHtml(string name, object data) { VelocityEngine vltEngine = new VelocityEngine(); vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER, "file"); vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates"));//模板文件所在的文件夹 vltEngine.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8"); vltEngine.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8"); vltEngine.Init(); VelocityContext vltContext = new VelocityContext(); vltContext.Put("Data", data); Template vltTemplate = vltEngine.GetTemplate(name); System.IO.StringWriter vltWriter = new System.IO.StringWriter(); vltTemplate.Merge(vltContext, vltWriter); return vltWriter.GetStringBuilder().ToString(); }
然后我在.cs文件 中这样赋值参数
protected void Page_Load(object sender, EventArgs e) { var data = new SiteConfig_bll().GetSiteConfig(); Response.Write(RenderHtml.NRenderHtml("index.html", new { siteconfig = data })); }
,然后在模板文件中我就可以用$Data.siteconfig.SiteName来调用了。
这样的简单的应用没问题。
但是我们做网站的时候,数据都不会这么简单。
如在首页,我们有“最新新闻LastNews”,“热点新闻HotNews”,“推荐新闻RecommendNews”等,有可能会增加,也有可能会减少。
那我们不可能在后台所有情况都考虑到,有可能这次只要“最新新闻LastNews”,“热点新闻HotNews”,明天我改版了加了一个“推荐新闻RecommendNews”。
那这里的Data数据该如何动态来确定?
var content=new {ListNews="1",HostNews="2"}; //通过匿名类来解决(我是这样解决) 模板页用进行判断
如果需求是固定的,用var content=new {ListNews="1",HostNews="2"};这样就可以了,前台也就只能调用ListNews和HostNews这二个。如果在这个页面我要一个RecommendNews,那我怎么传给var content?
@abc54288: 模板页和后台取数据的页面都有修改
//假如recommendNews是后台取出的数据,和listviews不一起的 string recommendNews=bll.GetNews(); var content=new {ListNews="1",HostNews="2",RecommendNews=recommendNews};