Asp.net 生成静态页面

第一次发表,有什么错误,请大家谅解噢!

如果不明白的话,建议自己拷一次。 就会的了。。

开发步骤:

1、路径映射类(UrlMapping),主要对路径进行拆分、拼接。(关键的一步)

2、过滤流类(FilterStream),主要负责生成静态页面。

3、静态页面类(HtmlPage),主要是调用UrlMapping和FilterStream类,

哪个页面想静态化,就继承这个类。

4、HtmlHandler类,路径后缀为Html的,都由它来处理,与HtmlPage类相似。

5、HtmlPanel类(控件),页面带上这个控件,超链接会静态化。(详情请下载源码包)

部分代码:

using System;
 using System.Data;
 using System.Configuration;
 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.HtmlControls;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.IO;

namespace Eshop.Web.UI
 {
     /// <summary>
     /// 路径映射
     /// </summary>
     public static class UrlMapping
     {
         //Aspx 转换到 Html
         public static string AspxToHtml(string url)
         {
             //判断路径是否为空
             if (string.IsNullOrEmpty(url))
             {
                 throw new ArgumentNullException("路径不能为空");
             }

            //分割路径
             string[] temp = url.Split(‘?‘);

            if (temp.Length != 1 && temp.Length != 2)
             {
                 throw new ArgumentException(String.Format("路径 {0} 及其参数错误", url));
             }

            //获取路径后缀
             string ext = Path.GetExtension(temp[0]);
            if (!(ext.Equals(".aspx", StringComparison.OrdinalIgnoreCase)))
             {
                 throw new ArgumentException(String.Format("路径 {0} 类型必须为ASPX", url));
             }

            //截取.aspx中前面的内容
             int offset = temp[0].LastIndexOf(‘.‘);
             string resource = temp[0].Substring(0, offset);

            //路径不带参数时
             if (temp.Length == 1 || string.IsNullOrEmpty(temp[1]))
             {
                 return string.Format("{0}.html", resource);    //拼接
             }

            //路径带参数时
             return string.Format("{0}___{1}.html", resource, temp[1]); //拼接
         }

        //Html 转换到 Aspx
         public static string HtmlToAspx(string url)
         {
             //判断路径是否为空
             if (string.IsNullOrEmpty(url))
             {
                 throw new ArgumentNullException("路径不能为空");
             }

            string ext = Path.GetExtension(url);
             if (!(ext.Equals(".html", StringComparison.OrdinalIgnoreCase)))
             {
                 throw new ArgumentException(String.Format("路径 {0} 类型必须为HTML", url));
             }

            string[] temp = url.Split(new String[] { "___", "." }, StringSplitOptions.RemoveEmptyEntries);
             if (temp.Length == 2)
             {
                 return string.Format("{0}.aspx", temp[0]);
             }

            if (temp.Length == 3)
             {
                 return String.Format("{0}.aspx?{1}", temp[0], temp[1]);
             }

            throw new ArgumentException(String.Format("资源 {0} 及其参数错误", url));
         }
     }
 }

  

using System;
 using System.Data;
 using System.Configuration;
 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.HtmlControls;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.IO;

namespace Eshop.Web.UI
 {
     /// <summary>
     /// 静态网页保存
     /// </summary>
     public class FilterStream : Stream
     {
         private Stream respStream = null;
         private Stream fileStream = null;

        public FilterStream(Stream respStream, string filePath)
         {
             if (respStream == null)
                 throw new ArgumentNullException("输出流不能为空");

            this.respStream = respStream;

            try
             {
                 this.fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);  //写入到文件夹中
             }
             catch { }
         }

        public override bool CanRead
         {
             get { return this.respStream.CanRead; }
         }

        public override bool CanSeek
         {
             get { return this.respStream.CanSeek; }
         }

        public override bool CanWrite
         {
             get { return this.respStream.CanWrite; }
         }

        public override void Flush()
         {
             this.respStream.Flush();

            if (this.fileStream != null)
             {
                 this.fileStream.Flush();
             }
         }

        public override long Length
         {
             get { return this.respStream.Length; }
         }

        public override long Position
         {
             get
             {
                 return this.respStream.Position;
             }
             set
             {
                 this.respStream.Position = value;

                if (this.fileStream != null)
                 {
                     this.fileStream.Position = value;
                 }
             }
         }

        public override int Read(byte[] buffer, int offset, int count)
         {
             return this.respStream.Read(buffer, offset, count);
         }

        public override long Seek(long offset, SeekOrigin origin)
         {
             if (this.fileStream != null)
             {
                 this.fileStream.Seek(offset, origin);
             }

            return this.respStream.Seek(offset, origin);
         }

        public override void SetLength(long value)
         {
             this.respStream.SetLength(value);

            if (this.fileStream != null)
             {
                 this.fileStream.SetLength(value);
             }
         }

        public override void Write(byte[] buffer, int offset, int count)
         {
             this.respStream.Write(buffer, offset, count);

            if (this.fileStream != null)
             {
                 this.fileStream.Write(buffer, offset, count);
             }
         }

        protected override void Dispose(bool disposing)
         {
             base.Dispose(disposing);

            this.respStream.Dispose();
             if (this.fileStream != null)
             {
                 this.fileStream.Dispose();
             }
         }
     }
 }

  

using System;
 using System.Data;
 using System.Configuration;
 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.HtmlControls;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.IO;

namespace Eshop.Web.UI
 {
     /// <summary>
     /// 哪个页面想静态化,就继承这个类
     /// </summary>
     public class HtmlPage:Page
     {
         // <summary>
         /// 获取物理路径,判断文件夹中有没有存在这个文件
         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
         /// 存在的话,就直接显示页面
         /// </summary>
         public override void ProcessRequest(HttpContext context)
         {
             HttpRequest req = context.Request;
             HttpResponse resp = context.Response;

            string htmlPage = UrlMapping.AspxToHtml(req.RawUrl);
             string htmlFile = context.Server.MapPath(htmlPage);

            if (File.Exists(htmlFile))
             {
                 resp.Redirect(htmlPage);
                 return;
             }

            // Html 页面不存在
             resp.Filter = new FilterStream(resp.Filter, htmlFile);
             base.ProcessRequest(context);
         }
     }
 }

  

using System;
 using System.Data;
 using System.Configuration;
 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.HtmlControls;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.IO;

namespace Eshop.Web.UI
{
     /// <summary>
     /// 后缀为HTML的,都经这里处理
     /// web.config
     /// <remove verb="*" path="*.HTML"/>
     /// <add verb="*" path="*.HTML" type="Eshop.Web.UI.HtmlHandler,AspxToHtmlDemo"/>
     /// </summary>
     public class HtmlHandler:IHttpHandler
     {
         public bool IsReusable
         {
             get { return false; }
         }

        /// <summary>
         /// 获取物理路径,判断文件夹中有没有存在这个文件
         /// 不存在的话,就会调用FilterStream类进行创建,并写入内容
         /// 存在的话,就直接显示页面
         /// </summary>
         public void ProcessRequest(HttpContext context)
         {
             HttpRequest request = context.Request;
             HttpResponse response = context.Response;

            string htmlPage = request.RawUrl;
             string htmlFile = context.Server.MapPath(htmlPage);

            if (File.Exists(htmlFile))
             {
                 response.WriteFile(htmlFile);
                 return;
             }

            //Html 文件不存在
             string aspxPage = UrlMapping.HtmlToAspx(htmlPage);
             response.Redirect(aspxPage);
         }

    }
 }

  

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="Eshop.Web.Index" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
 <head runat="server">
     <title>AspxToHtml Demo</title>
 </head>
 <body>
     <form id="form1" runat="server">
     <div>
         <h1>AspxToHtml Demo</h1>
         <br />

        <html:HtmlPanel ID="hp" runat="server">
             <asp:HyperLink ID="Hy" runat="server" NavigateUrl="~/Index.aspx?page=2">
                    点击
             </asp:HyperLink>
             <br />
             <a href="~/Index.aspx?page=2" runat="server">Hello</a>
         </html:HtmlPanel>
     </div>
     </form>
 </body>
 </html>

  

Asp.net 生成静态页面

时间: 2024-10-16 16:51:27

Asp.net 生成静态页面的相关文章

ASP.NET生成静态页面方法大全

方案1: /// <summary> /// 传入URL返回网页的html代码 /// </summary> /// <param name="Url">URL</param> /// <returns></returns> public static string getUrltoHtml(string Url) { errorMsg = ""; try { System.Net.WebReq

如何生成静态页面的五种方案

方案1: /// <summary> /// 传入URL返回网页的html代码 /// </summary> /// <param name="Url">URL</param> /// <returns></returns> public static string getUrltoHtml(string Url) { errorMsg = ""; try { System.Net.WebReq

.net 生成 静态页面

.net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespace=System.IO %> <script runat="server"> protected override void OnInit (EventArgs e) { int id; try { id = int.Parse (Request.QueryString[

.NET生成静态页面并分页

因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态模板页面 template.html,主要是定义了一些特殊字符,用来被替换. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dt

过滤器为JSP文件生成静态页面

用过滤器为JSP文件生成静态页面,这只是一个简单的实例,客户端浏览器第一次请求JSP页面时,服务器将生成对应的HTML文件,以后访问同一JSP文件,将转为访问生成的HTML文件.一.过滤器 package com.kenfor.lyb.toHtmlfilter; import java.io.*; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.s

C#根据网址生成静态页面

HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: bool CreateHtmlFile(string url, string path) { //http://keleyi.com/a/bjae/3d10wfax.htm string m_content = Utils.GetHtmlByUrl(Utils.GetAbsolutePath() + ur

PHP代码为什么不能直接保存HTML文件——&gt;PHP生成静态页面教程

1.服务器会根据文件的后缀名去进行解析,如果是HTML文件则服务器不会进行语法解析,而是直接输出到浏览器. 2.如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件,这样反而会降低运行效率. 3.如果是需要PHP控制HTML代码的输出,比如需要PHP判断用户是否登陆,如果登陆则输出A,未登录则输出B.这就需要PHP来进行控制了.HTML不能实现这样的功能 PHP生成静态页面教程 ,一些基本的概念 一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可

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

它只让你修改页面的某一部分,当然这“某一部分”是由你来确定的.美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种代码是Dreamwerver为了方便自己设计而弄的标识),把这个模板中我们需要改变的地方用一个与HTML可以区分的字符代替,如“{title}”.“[title]”.在生成静态页面的时候只需要把数据和这些字符串替换即可.这就是模板的含义了. 新建一个php页面和一个html页面[模板页];注:如果是从数据库调用数据,则

PHP生成静态页面的方法

在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化,今天就以PHP实例教程形式讨论PHP生成静态页面的方法...."><LINKhref="http://www.php100.com//statics/st 在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化