栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#实现动态生成静态页面的类详解

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#实现动态生成静态页面的类详解

本文实例讲述了C#实现动态生成静态页面的类。分享给大家供大家参考,具体如下:

动态生成静态页面有许多好处,比如生成html网页有利于被搜索引擎收录。同时,由于减少了数据访问,减轻对数据库访问的压力,提高了网页打开速度。

基本思路:

使用一个字符串作为页面模板,再页面中包含用若干标志(用 {标志名} 表示),生成页面时,将标志替换为对应的值。

实现方法:

在初始化TextTemplate实例时读入模板,以标志为分割点将模板分割成几部分,生成页面时只需简单的将模板内容和标志的值连接起来。例如:
假如有一个模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN
初始化时将模板分割成 "ABCD","EFG","HIJ","KMUN"四个字符串,
假设TAG1=“123”,TAG2=“456”,TAG3=“789”
则生成是相当于执行"ABCD"+"123"+"EFG"+"456"+"HIJ"+"789"+"KMUN"

代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Regularexpressions;
using System.Collections;
using System.IO;
/// 
/// 表示一个文本模板,该类使用一个字符串作为模板,通过将模板中的标志替换为对应的值(模板中的标志用 {标志名} 表示)生成新的文本
/// 
/// 以下代码用文本模板生成IMG标志
/// 
/// static class Program
/// {
///  [STAThread]
///  static void Main()
///  {
///   TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />");
///   Console.WriteLine(temp.Render("pic.bmp","Image"));
///   Hashtable values = new Hashtable();
///   values.Add("src", "pic.bmp");
///   values.Add("alt", "image");
///   Console.WriteLine(temp.Render(values));
///  }
/// }
///
/// 输出为:
/// <img src='pic.bmp' alt='Image' />
/// <img src='pic.bmp' alt='image' />
///
/// 
/// 
public class TextTemplate
{
 TextTemplateTag[] _tags;
 String[] _contentParts;
 int _tagCount;
 private TextTemplate()
 {
  _tagCount = 0;
  _tags = null;
  _contentParts = null;
 }
 /// 
 /// 用指定的模板初始化TextTemplate
 /// 
 /// 模板内容
 public TextTemplate(String content)
 {
  FromString(content);
 }
 /// 
 /// 用指定的模板初始化TextTemplate,模板内容重文件读入
 /// 
 /// 模板文件位置
 /// 文件使用的编码
 public TextTemplate(string file, Encoding encoding)
 {
  StreamReader sr = new StreamReader(file, encoding);
  try
  {
   string content = sr.ReadToEnd();
   FromString(content);
  }
  catch (Exception)
  {
   sr.Close();
   throw;
  }
  sr.Close();
 }
 /// 
 /// 读入模板并以标志为分割点分割模板
 /// 
 /// 
 private void FromString(String content)
 {
  MatchCollection mc = Regex.Matches(content, "{\w+}");
  _tagCount = mc.Count;
  _tags = new TextTemplateTag[mc.Count];
  _contentParts = new string[mc.Count + 1];
  int index = 0;
  foreach (Match m in mc)
  {
   _tags[index++] = new TextTemplateTag(m.Value.Substring(1, m.Value.Length - 2), m.Index, m.Length);
  }
  int start = 0;
  index = 0;
  foreach (TextTemplateTag con in _tags)
  {
   _contentParts[index] = content.Substring(start, con.Position - start);
   start = con.Position + con.Length;
   index++;
  }
  if (start < content.Length) _contentParts[index] = content.Substring(start);
 }
 /// 
 /// 用指定的值生成文本
 /// 
 /// 各标志对应的值(用标志名作为key)
 /// 生成的文本
 /// 以下代码用文本模板生成IMG标志
 /// 
 /// static class Program
 /// {
 ///  [STAThread]
 ///  static void Main()
 ///  {
 ///   TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />");
 ///   Console.WriteLine(temp.Render("pic.bmp","Image"));
 ///   Hashtable values = new Hashtable();
 ///   values.Add("src", "pic.bmp");
 ///   values.Add("alt", "image");
 ///   Console.WriteLine(temp.Render(values));
 ///  }
 /// }
 ///
 /// 输出为:
 /// <img src='pic.bmp' alt='Image' />
 /// <img src='pic.bmp' alt='image' />
 ///
 /// 
 /// 
 public string Render(Hashtable values)
 {
  StringBuilder result = new StringBuilder(8 * 1024);
  int i = 0;
  for (i = 0; i < _tagCount; i++)
  {
   result.Append(_contentParts[i]);
   if (values[_tags[i].Name] != null)
    result.Append(values[_tags[i].Name]);
   else
    result.Append("{" + _tags[i].Name + "}");
  }
  result.Append(_contentParts[i]);
  return result.ToString();
 }
 /// 
 /// 用指定的值生成文本
 /// 
 /// 各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)
 /// 生成的文本
 /// 以下代码用文本模板生成IMG标志
 /// 
 /// static class Program
 /// {
 ///  [STAThread]
 ///  static void Main()
 ///  {
 ///   TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />");
 ///   Console.WriteLine(temp.Render("pic.bmp","Image"));
 ///   Hashtable values = new Hashtable();
 ///   values.Add("src", "pic.bmp");
 ///   values.Add("alt", "image");
 ///   Console.WriteLine(temp.Render(values));
 ///  }
 /// }
 ///
 /// 输出为:
 /// <img src='pic.bmp' alt='Image' />
 /// <img src='pic.bmp' alt='image' />
 ///
 /// 
 /// 
 public string Render(params object[] args)
 {
  StringBuilder result = new StringBuilder(2 * 1024);
  int i = 0;
  for (i = 0; i < _tagCount; i++)
  {
   result.Append(_contentParts[i]);
   result.Append(args[i].ToString());
  }
  result.Append(_contentParts[i]);
  return result.ToString();
 }
 /// 
 /// 用指定的值生成文本,并保存到文件中
 /// 
 /// 要保存的文件路径
 /// 文件的编码
 /// 各标志对应的值(用标志名作为key)
 public void SaveAs(string file, Encoding encoding, Hashtable values)
 {
  StreamWriter sw = new StreamWriter(file, false, encoding);
  try
  {
   String content = Render(values);
   sw.Write(content);
  }
  catch (Exception)
  {
   sw.Close();
   throw;
  }
  sw.Close();
 }
 /// 
 /// 用指定的值生成文本,并保存到文件中
 /// 
 /// 要保存的文件路径
 /// 文件的编码
 /// 各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)
 public void SaveAs(string file, Encoding encoding, params object[] args)
 {
  StreamWriter sw = new StreamWriter(file, false, encoding);
  try
  {
   String content = Render(args);
   sw.Write(content);
  }
  catch (Exception)
  {
   sw.Close();
   throw;
  }
  sw.Close();
 }
 /// 
 /// 将模板以指定的分隔标志分隔成小模板
 /// 
 /// 
 /// 
 public TextTemplate[] Split(string splitTag)
 {
  List temps = new List();
  List contentParts = new List();
  List tags = new List();
  int i = 0;
  foreach (string content in _contentParts)
  {
   contentParts.Add(content);
   if (i >= _tags.Length || _tags[i].Name == splitTag)
   {
    TextTemplate newTemp = new TextTemplate();
    newTemp._contentParts = contentParts.ToArray();
    newTemp._tags = tags.ToArray();
    newTemp._tagCount = tags.Count;
    temps.Add(newTemp);
    contentParts.Clear();
    tags.Clear();
   }
   else
    tags.Add(new TextTemplateTag(_tags[i].Name, _tags[i].Position, _tags[i].Length));
   i++;
  }
  return temps.ToArray();
 }
}
internal class TextTemplateTag
{
 int _position, _length;
 string _name;
 public TextTemplateTag(string name, int pos, int len)
 {
  _name = name;
  _position = pos;
  _length = len;
 }
 public string Name
 {
  get { return _name; }
 }
 public int Position
 {
  get { return _position; }
 }
 public int Length
 {
  get { return _length; }
 }
}

实例代码:

static class Program
{
 [STAThread]
 static void Main()
 {
  TextTemplate temp = new TextTemplate("");
  Console.WriteLine(temp.Render("pic.bmp","Image"));
  Hashtable values = new Hashtable();
  values.Add("src", "pic.bmp");
  values.Add("alt", "image");
  Console.WriteLine(temp.Render(values));
 }
}

输出为:


其他应用:

TextTemplate还可以用来在安装网站时生成Web.Config文件,只需定义以下模板:



 
 
  
 
 其他配置


在设置标志 ConNECTIONSTRING 的值即可,这种方法比用XMLdocument类要方便得多。

总结:

TextTemplate的优点有:

1、模板只在初始化时就分析并分割存储,当使用同一模板生成多个页面时,只是简单的件模板内容和标志的值连接起来,不需要每次都去分析模板,如果使用string的Replace方法则每一次都要去分析字符串,而且如果标志值中含有标志,会影响生成的页面。

2、模板可以从文件读入,因此模板文件可以使用各种网页制作工具编辑。

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#数据结构与算法教程》、《C#常见控件用法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》

希望本文所述对大家C#程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号