03月 1st, 2007

本文介绍两种实现ASP.NET页面动态转静态的方法:一是使用模板转换,涉及读取模板文件并替换内容;二是重写AttributeCollection.Render,更灵活地在页面生成后进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:
  由于搜索引擎对aspx页面收录和html页面收录率的差别以及页面资源占用问题,我们很多时候需要实现ASPX页面动态转静态。网上也有很多人
  讨论其实现方法,本人实践后总结两种主流方法如下:
  第一种方法:
  使用模板转换,步骤如下:
  1、建立MyConvert.cs类文件
  using System;
  //记得添加以下三引用
  using System.Text;
  using System.Web;
  using System.IO;
  namespace TesConvert
  {
  ///
  /// MyConvert 的摘要说明。
  ///

  public class MyConvert
  {
   public MyConvert()
   {
  //
  // TODO: 在此处添加构造函数逻辑
  //
   }
   public bool WriteFile(string strText,string strContent,string strAuthor)
   {
  string path = HttpContext.Current.Server.MapPath(”/TesConvert/news/”);//定义html文件存放路径
  Encoding code = Encoding.GetEncoding(”gb2312″);//定义文字编码
  // 读取模板文件
  string temp = HttpContext.Current.Server.MapPath(”/TesConvert/text.html”);
  StreamReader sr=null;
  StreamWriter sw=null;
  string str=”";?
  try
  {
   sr = new StreamReader(temp, code);
   str = sr.ReadToEnd(); // 读取文件
  }
  catch(Exception exp)
  {
   HttpContext.Current.Response.Write(exp.Message);
   HttpContext.Current.Response.End();
   sr.Close();
  }
  string htmlfilename=path + DateTime.Now.ToString(”yyyyMMddHHmmss”)+”.html”;
  // 替换内容
  // 这时,模板文件已经读入到名称为str的变量中了
  str = str.Replace(”ShowArticle”,strText); //模板页中的ShowArticle
  str = str.Replace(”title”,strText);
  str = str.Replace(”content”,strContent);
  str = str.Replace(”author”,strAuthor);
  // 写文件
  try
  {
   sw = new StreamWriter(htmlfilename,false,code);
   sw.Write(str);
   sw.Flush();
  }
  catch(Exception ex)
  {
   HttpContext.Current.Response.Write(ex.Message);
   HttpContext.Current.Response.End();
  }
  finally
  {
   sw.Close();
  }
  return true;
   }
   }
  }
  2、TestNews.aspx文件:
  添加三和TextBox分别为:tbx_Title、tbx_Content、tbx_Author和一个Button:btn_AddNews。
  TestNews.aspx.cs文件
  private void btn_AddNews_Click(object sender, System.EventArgs e)
   {
  MyConvert Hover = new MyConvert();
  
  if(Hover.WriteFile(this.txb_Title.Text.ToString(),Server.HtmlDecode(this.txb_Content.Value),this.txb_Author.Text.ToString()))
  {
   Response.Write(”添加成功”);
  }
  else
  {
   Response.Write(”生成HTML出错!”);
  }
   }
  3、添加模板text.html文件?
  ShowArticle
  
  title

  content

  author
  
  说明:一.news文件夹必须赋予asp.net用户写入的权限。这是一个简单的实现例子,实际项目必须先将数据保存到数据库下面,在datagird中
  调用数据库下面html文件的URL地址。二.默认情况下,我们是不能向TextBox、TextArea中添加html语法的,必须修改config文件,在
   下面添加 ,但是这样做的话,整个项目中都允许键入html标签了,暂时还不知道其他的方。
  缺点:这种方法是在ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作以前曾说过用HttpModule来在Response前更改,不够灵活
  ,每行修改response,比较费力。
  第二种方法:
  重写AttributeCollection.Render,比较灵活(msdn如是说:“在呈现阶段,所有 ASP.NET 移动设备适配器都通过一个称为文本编写器的对象
  来编写它们的输出。文本编写器对象是从 TextWriter 基类创建的。”)
  可以写个基类,如:
  public class BasePage: System.Web.UI.Page
  {
   public BasePage()
   {
   }
   protected override void Render(System.Web.UI.HtmlTextWriter writer)
   {
   string name=Request.Url.AbsolutePath.Substring(1,Request.Url.AbsolutePath.Length-1).Replace(”aspx”,”htm”);
   string newurl=”";
   if(name.IndexOf(”/”)>0)
   {
   newurl=Server.MapPath(”../”) + name;
   }
   else
   {
   newurl=Server.MapPath(”./”) + name;
   }
   MemoryStream ms = new MemoryStream();
   StreamWriter sww = new StreamWriter(ms);
   StreamWriter swr = new StreamWriter(newurl);
   System.Web.UI.HtmlTextWriter htmlw = new HtmlTextWriter(swr);
   base.Render(htmlw);
   htmlw.Flush();
   htmlw.Close();
   string strLL = System.Text.Encoding.UTF8.GetString(ms.ToArray());
   Response.Write(strLL);
   Response.Redirect(Request.Url.AbsoluteUri.Replace(”aspx”,”htm”), true);
   }
  }
  然后在需要生成静态页面的页面中继承就可以了。
  说明:这种办法是在Asp.net的生成动作完成之后,再进行一次转换。
  缺点:觉得本质上应该还是属于频繁post的aspx页面。

本文转自
http://blog.oteam.cn/2007/03/01/aspnet-%E5%8A%A8%E6%80%81%E8%BD%AC%E9%9D%99%E6%80%81%E9%A1%B5%E9%9D%A2%E7%9A%84%E4%B8%A4%E7%A7%8D%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93%E8%BD%AC%E8%B4%B4/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值