.NET模板引擎 EFPlatform.CodeGenerator (代码生成器 静态页生成 生成HTML 模板)

转载 2007年09月14日 10:03:00
<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>

这个东东是去年我看着ASP:标记突发奇想花4天时间设计编写的类库, 原名叫 HtmlGenerator, 最近发现PHP和JAVA有很多类似的项目, 但是都设计的很渣(不同意的表打我@_@), 于是把 HtmlGenerator 重构了一下, 改叫 CodeGenerator. 配合我的数据库迁移工具和数据库实体类生成品..... 好像跑题了 -____-

<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>

CodeGenerator 的特点:
1. 标记简结实用, 所有网页美工都能在一分钟内掌握. 而且不与HTML标准冲突, 模板页可用任何WYSIWYG工具编辑, 和编辑普通HTML网完全相同.
2. 标记只与表示层相关, 不包括任何业务逻辑, 丝毫不影响你应用多层结构.
3. 标记到后台被解析成了生成器对象, 完全面向对象, 不像绝大多数生成器要死嗑字符串.
4. 生成器对象使用DataSource属性取得数据, DataSource可以为  简单值类型(如 int, DateTIme), 也可以为简单数组(如 decimal[], string[]), 还可以为ADO.NET数据集(如DataTable), 甚至单个对象实体或对象集合或列表(如 SomeClassCollection, List<SomeClass>), 所有数据源类型通吃! 哈哈, 比ASP.NET带的数据控件支持的类型还多.
5. 标记的Name直接与数据源的列名ColumnName或属性名PropertyName, 好处不言而喻了吧.
6. 说到这里好了, 留一手先. 呵呵

<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>


演示地址: http://efplatform.net/demo/codegenerator/default.aspx
EFPlatform.CodeGenerator 源代码下载地址: http://www.cnblogs.com/Files/ericfine/EFPlatform.CodeGenerator.rar
EFPlatform.TemplateEngine 源代码下载地址: http://www.cnblogs.com/Files/ericfine/EFPlatform.TemplateEngine.rar (其实就是CodeGenerator的优化版:))

<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>

应用项目:
http://portray.mz99.com/
http://music.mz99.com/
http://joke.mz99.com/
http://www.mcuol.com/

应用流程:




Default.aspx.cs:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.IO;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EFPlatform.CodeGenerator;

public partial class _Default : Page
{
    
private string outputPath;
    
private string categoryFileName;
    
private string productFileName;
    
private static DbProviderFactory dbFactory;
    
private DbConnection connection;

    
protected void Page_Load(object sender, EventArgs e)
    {
        outputPath 
= Server.MapPath("./");
        categoryFileName 
= string.Format(@"{0}/Template/Category.html", outputPath);
        productFileName 
= string.Format(@"{0}/Template/Product.html", outputPath);
        
string currentConnection = ConfigurationManager.AppSettings["Connection"];
        ConnectionStringSettings css 
= ConfigurationManager.ConnectionStrings[currentConnection];
        
this.GetConnection(css);
    }

    
private void GenerateCategory()
    {
        
string template = Helper.ReadTextFile(categoryFileName);
        Generator gen 
= new Generator(template);
        gen.ParseTemplate();
        Region rgnTitle 
= gen.Regions["Title"];
        Region rgnCategory 
= gen.Regions["Category"];
        Region rgnProducts 
= gen.Regions["Products"];
        Region rgnNavigator 
= gen.Regions["Navigator"];

        
if(rgnTitle == null || rgnCategory == null || rgnProducts == null || rgnNavigator == null)
        {
            Response.Write(
"Missing region.");
            
return;
        }

        
int categoryId;
        
string outputFileName;
        DataView dvCategory 
= this.GetCategoryTable().DefaultView;
        Pager pgrCategory 
= new Pager(1, dvCategory.Count);

        
for(int i = 0; i < pgrCategory.PageCount; i++)
        {
            rgnTitle.DataSource 
= (string)dvCategory[i]["CategoryName"];        //Use a string as data source
            rgnCategory.DataSource = dvCategory[i];        //Use a DataRowView object as data source
            pgrCategory.CurrentPage = i + 1;
            rgnNavigator.DataSource 
= pgrCategory;        //Use a Pager object as data source
            categoryId = (int)dvCategory[i]["CategoryID"];
            rgnProducts.DataSource 
= this.GetProductTable(categoryId);        //Use a DataTable object as data souce
            outputFileName = string.Format(@"{0}/Html/Category{1}.html", outputPath, categoryId);
            Helper.WriteTextFile(outputFileName, gen.Generate());
        }
    }

    
private void GenerateProduct()
    {
        
string template = Helper.ReadTextFile(productFileName);
        Generator gen 
= new Generator(template);
        gen.ParseTemplate();
        Region rgnTitle 
= gen.Regions["Title"];
        Region rgnProduct 
= gen.Regions["Product"];
        Region rgnNavigator 
= gen.Regions["Navigator"];

        
if(rgnTitle == null || rgnProduct == null || rgnNavigator == null)
        {
            Response.Write(
"Missing region.");
            
return;
        }

        
string outputFileName;
        List
<Product> productList = this.GetProductList();
        Pager pgrProduct 
= new Pager(1, productList.Count);

        
for(int i = 0; i < pgrProduct.PageCount; i++)
        {
            rgnTitle.DataSource 
= productList[i].CategoryName;        //Use a string as data source
            rgnProduct.DataSource = productList[i];        //Use a Product object as data source
            pgrProduct.CurrentPage = i + 1;
            rgnNavigator.DataSource 
= pgrProduct;        //Use a Pager object as data source
            outputFileName = string.Format(@"{0}/Html/Product{1}.html", outputPath, productList[i].ProductID);
            Helper.WriteTextFile(outputFileName, gen.Generate());
        }
    }

    
#region DataSourcePreparing
    
private void GetConnection(ConnectionStringSettings css)
    {
        
if(dbFactory == null)
        {
            dbFactory 
= DbProviderFactories.GetFactory(css.ProviderName);
        }

        
this.connection = dbFactory.CreateConnection();
        
this.connection.ConnectionString = css.ConnectionString;
    }

    
private DataTable GetCategoryTable()
    {
        
string commandText = "SELECT CategoryID, CategoryName, Description FROM Categories";
        DbDataAdapter da 
= dbFactory.CreateDataAdapter();
        da.SelectCommand 
= dbFactory.CreateCommand();
        da.SelectCommand.Connection 
= this.connection;
        da.SelectCommand.CommandText 
= commandText;
        DataTable dt 
= new DataTable();
        
this.connection.Open();
        da.Fill(dt);
        
this.connection.Close();
        
return dt;
    }

    
private DataTable GetProductTable(int categoryId)
    {
        
string commandText = string.Format("SELECT * FROM Products WHERE CategoryID = {0}", categoryId);
        DbDataAdapter da 
= dbFactory.CreateDataAdapter();
        da.SelectCommand 
= dbFactory.CreateCommand();
        da.SelectCommand.Connection 
= this.connection;
        da.SelectCommand.CommandText 
= commandText;
        DataTable dt 
= new DataTable();
        
this.connection.Open();
        da.Fill(dt);
        
this.connection.Close();
        
return dt;
    }

    
private List<Product> GetProductList()
    {
        
string commandText = "SELECT p.*, c.CategoryName, s.CompanyName FROM (Products AS p INNER JOIN Categories AS c ON p.CategoryID = c.CategoryID) INNER JOIN Suppliers AS s ON p.SupplierID = s.SupplierID ORDER BY p.ProductID";
        DbCommand command 
= this.connection.CreateCommand();
        command.CommandText 
= commandText;
        List
<Product> productList = new List<Product>();
        Product product;
        
this.connection.Open();

        
using(DbDataReader dr = command.ExecuteReader())
        {
            
while(dr.Read())
            {
                product 
= new Product();
                Helper.FillModel(product, dr);
                productList.Add(product);
            }
        }

        
this.connection.Close();
        
return productList;
    }

    
private class Product
    {
        
private int productID;

        
public int ProductID
        {
            
get { return productID; }
            
set { productID = value; }
        }

        
private string productName;

        
public string ProductName
        {
            
get { return productName; }
            
set { productName = value; }
        }

        
private string companyName;

        
public string CompanyName
        {
            
get { return companyName; }
            
set { companyName = value; }
        }

        
private int categoryID;

        
public int CategoryID
        {
            
get { return categoryID; }
            
set { categoryID = value; }
        }

        
private string categoryName;

        
public string CategoryName
        {
            
get { return categoryName; }
            
set { categoryName = value; }
        }

        
private string quantityPerUnit;

        
public string QuantityPerUnit
        {
            
get { return quantityPerUnit; }
            
set { quantityPerUnit = value; }
        }

        
private decimal unitPrice;

        
public decimal UnitPrice
        {
            
get { return unitPrice; }
            
set { unitPrice = value; }
        }

        
private int unitsInStock;

        
public int UnitsInStock
        {
            
get { return unitsInStock; }
            
set { unitsInStock = value; }
        }

        
private int unitsOnOrder;

        
public int UnitsOnOrder
        {
            
get { return unitsOnOrder; }
            
set { unitsOnOrder = value; }
        }

        
private int reorderLevel;

        
public int ReorderLevel
        {
            
get { return reorderLevel; }
            
set { reorderLevel = value; }
        }

    }
    
#endregion

    
protected void Button1_Click(object sender, EventArgs e)
    {
        
this.GenerateCategory();
    }

    
protected void Button2_Click(object sender, EventArgs e)
    {
        
this.GenerateProduct();
    }
}

Web.config:

<?xml version="1.0"?>
<configuration>
    
<system.web>
        
<compilation debug="true" />
        
<authentication mode="Windows" />
        
<customErrors mode="Off" defaultRedirect="GenericErrorPage.htm">
            
<error statusCode="403" redirect="NoAccess.htm" />
            
<error statusCode="404" redirect="FileNotFound.htm" />
        
</customErrors>
    
</system.web>
    
<connectionStrings>
        
<add name="Access" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb"/>
        
<add name="SqlExpress" providerName="System.Data.SqlClient" connectionString="Data Source=./SQLExpress;Integrated Security=True;User Instance=True;Database=Northwind;AttachDBFilename=|DataDirectory|Northwind.mdf"/>
    
</connectionStrings>
    
<appSettings>
        
<add key="Connection" value="Access"/>
    
</appSettings>
</configuration>


 

<script type="text/javascript">google_ad_client = "pub-2048279401139630";google_ad_slot = "8856771542";google_ad_width = 728;google_ad_height = 90;document.write("<s"+"cript type='text/javascript' s"+"rc='http://pagead2.googlesyndication.com/pagead/show_ads"+"."+"js'></scr"+"ipt>");</script>

.NET模板引擎 EFPlatform.CodeGenerator (代码生成器 静态页生成 生成HTML 模板)

这个东东是去年我看着ASP:标记突发奇想花4天时间设计编写的类库, 原名叫 HtmlGenerator, 最近发现PHP和JAVA有很多类似的项目, 但是都设计的很渣(不同意的表打我@_@), 于是把...
  • mhkbluesky
  • mhkbluesky
  • 2007年11月30日 16:02
  • 506

C#(asp.net)根据静态模板生成静态(html)页面

   网站采用静态页面有利于搜索引擎优化,用户打开页面的速度,还可以增加网站的安全性。由于静态页面不需与数据库进行交互,在用户体验上有大幅度的提高。       以25亿企业网站管理系统中的源码作...
  • xiaolingwei
  • xiaolingwei
  • 2011年01月12日 16:06
  • 1100

一个基于velocity模板引擎的代码生成器

之前在论坛看到一个.NET的代码生成器,挺好的。 话说一千个程序员手中有一千种代码生成器,因此我也来分享一个,多多少少能对大家有所帮助。 首先介绍下,这个代码生成器是一个java web项目。...
  • juedaishusheng
  • juedaishusheng
  • 2015年11月04日 11:44
  • 1980

Java之利用Freemarker模板引擎实现代码生成器,提高效率

开心一笑【1.你以为我会眼睁睁的看着你去送死?我会闭着眼睛。2.给你讲个故事,从前有个笨蛋,他非常笨,别人问他问题他只会回答“没有”,这个故事你听过吗?】提出问题如何利用 Java + Freemar...
  • huangwenyi1010
  • huangwenyi1010
  • 2017年05月06日 10:57
  • 5575

使用Spring计时器和velocity模板定时生成静态html/jsp文件

当一个页面不是经常需要更新的话,就需要为它定时生成一个静态文件,这样可以减轻服务器压力,相应的也减少了用户等待时间。 首先看一下一个主jsp文件: 新闻快讯 ...
  • gundumw100
  • gundumw100
  • 2017年04月10日 18:00
  • 304

asp.net(c#)生成静态html页面

生成静态页面的好处就很多了,比如提高访问速度,利于搜索引擎抓取等等。下面这个是利用替换模板中特殊字符的原理写的。供大家交流学习…… using System;using System.Data;usi...
  • zdyguilong
  • zdyguilong
  • 2007年03月20日 11:33
  • 6626

【smarty模板引擎技术】smarty模板引擎技术生成html静态网页的方法

简介:本文简要浅析smarty的工作机制,以及smarty其他配置和使用方法 smarty百科: Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离...
  • yanhui_wei
  • yanhui_wei
  • 2012年12月20日 17:27
  • 6198

asp.net怎样一键生成静态页面,实例说明

由浅到深,通过实例来说明怎样使页面一键静态化,然后从效益出发,轻讨如何在实际应用中更灵活运用此功能。。...
  • jintougao
  • jintougao
  • 2014年04月23日 17:22
  • 4651

html模板生成静态页面及模板分页处理

它只让你修改页面的某一部分,当然这“某一部分”是由你来确定的。美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种代码是Dreamwe...
  • bmw601055
  • bmw601055
  • 2017年08月20日 16:17
  • 263

ecshop生成纯静态页

1. 打开index.php 找到 $smarty->display('index.dwt', $cache_id),并将其注释掉。   2. 在 includes/cls_template.ph...
  • qqahanson
  • qqahanson
  • 2014年02月24日 13:23
  • 1648
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET模板引擎 EFPlatform.CodeGenerator (代码生成器 静态页生成 生成HTML 模板)
举报原因:
原因补充:

(最多只允许输入30个字)