ASP.NET MVC生成静态页面

1.先付上封装好生成静态页的原代码:

public class Common
{
    #region 获取模板页的Html代码
    /// <summary>
    /// 获取页面的Html代码
    /// </summary>
    /// <param name="url">模板页面路径</param>
    /// <param name="encoding">页面编码</param>
    /// <returns></returns>
    public static string GetHtml(string url, System.Text.Encoding encoding)
    {
        byte[] buf = new WebClient().DownloadData(url);
        if (encoding != null)
        {
            return encoding.GetString(buf);
        }
        string html = System.Text.Encoding.UTF8.GetString(buf);
        encoding = GetEncoding(html);
        if (encoding == null || encoding == System.Text.Encoding.UTF8)
        {
            return html;
        }
        return encoding.GetString(buf);
    }

    /// <summary>
    /// 获取页面的编码
    /// </summary>
    /// <param name="html">Html源码</param>
    /// <returns></returns>
    public static System.Text.Encoding GetEncoding(string html)
    {
        string pattern = @"(?i)\bcharset=(?<charset>[-a-zA-Z_0-9]+)";
        string charset = Regex.Match(html, pattern).Groups["charset"].Value;
        try
        {
            return System.Text.Encoding.GetEncoding(charset);
        }
        catch (ArgumentException)
        {
            return null;
        }
    }
    #endregion

    #region 用于生成Html静态页
    /// <summary>
    /// 创建静态文件
    /// </summary>
    /// <param name="result">Html代码</param>
    /// <param name="createpath">生成路径</param>
    /// <returns></returns>
    public static bool CreateFileHtmlByTemp(string result, string createpath)
    {
        if (!string.IsNullOrEmpty(result))
        {
            if (string.IsNullOrEmpty(createpath))
            {
                createpath = "/default.html";
            }
            string filepath = createpath.Substring(createpath.LastIndexOf(@"\"));
            createpath = createpath.Substring(0, createpath.LastIndexOf(@"\"));
            if (!Directory.Exists(createpath))
            {
                Directory.CreateDirectory(createpath);
            }
            createpath = createpath + filepath;

            try
            {
                FileStream fs2 = new FileStream(createpath, FileMode.Create);
                StreamWriter sw = new StreamWriter(fs2, new System.Text.UTF8Encoding(false));//去除UTF-8 BOM
                sw.Write(result);
                sw.Close();
                fs2.Close();
                fs2.Dispose();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        return false;
    }
    #endregion

    #region 调用静态模板,并且传递数据模型实体类 创建Html静态页
    /// <summary>
    /// 解析模板生成静态页
    /// </summary>
    /// <param name="temppath">模板地址</param>
    /// <param name="path">静态页地址</param>
    /// <param name="t">数据模型</param>
    /// <returns></returns>
    public static bool CreateStaticPage<T>(string temppath, string path, T t)
    {
        try
        {
            //获取模板Html
            string TemplateContent = GetHtml(temppath, System.Text.Encoding.UTF8);

            //初始化结果
            string result = string.Empty;

            //解析模板生成静态页Html代码
            result = Razor.Parse(TemplateContent, t);

            //创建静态文件
            return CreateFileHtmlByTemp(result, path);
        }
        catch (Exception e)
        {
            throw e;
        }
    }
    #endregion
}

2.调用方法(创建一个多线程去执行,效果会更好):

//实例化调用方法
Task tk = new Task(CreateStaticHtml);
tk.Start();
//静态调用方法
Task.Factory.StartNew(() => CreateStaticHtml());

3.封装好的静态方法:

/// <summary>
/// 创建静态页面
/// </summary>
public void CreateStaticHtml()
{
    using (BangLiEntities bangLi = new BangLiEntities())
    {
        View_Home view_Home = new View_Home();
        view_Home.CommandAdExtendList = Dal.CommandAdDal.Instance(bangLi).GetInit().ToList();
        view_Home.NewsList = bangLi.News.OrderByDescending(u => u.AddDateTime).Take(5).ToList();
        view_Home.NewsExtendList = Dal.NewsDal.Instance(bangLi).GetInit().OrderByDescending(u => u.AddDateTime).Take(5).ToList();
        view_Home.News = Dal.NewsDal.Instance(bangLi).GetInit().Where(u => u.Id == 3).SingleOrDefault();
        string TemplateContent = Common.GetHtml(Server.MapPath("/Views/SourceHtml/Home/Index.cshtml"), System.Text.Encoding.UTF8);
        //初始化结果
        string result = string.Empty;
        //解析模板生成静态页Html代码
        result = Razor.Parse(TemplateContent, view_Home);
        //创建静态文件
        Common.CreateFileHtmlByTemp(result, Server.MapPath("/Resource/Manage/Html/Home/Index.html"));
    }
}

4.如首页执行时,可以在执行Action前去执行一个过滤器:

public class MyFirstHomeAttribute:ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var context = filterContext.HttpContext;
        context.Session["IsStaticHtml"] = false;
        string path = context.Server.MapPath("/Resource/Manage/Html/Home/Index.html");
        if (System.IO.File.Exists(path))
        {
            string html = System.IO.File.ReadAllText(path);
            context.Response.Write(html);
            context.Session["IsStaticHtml"] = true;
            context.Response.End();
        }
    }
}

5.执行首页:

[MyFirstHome]
public ActionResult Index()
{
    View_Home view_Home = null;
    var IsStaticHtml = Convert.ToBoolean(Session["IsStaticHtml"]);
    if (!IsStaticHtml)
    {
        view_Home = new View_Home();
        using (BangLiEntities bangLi = new BangLiEntities())
        {
            view_Home.CommandAdExtendList = Dal.CommandAdDal.Instance(bangLi).GetInit().ToList();
            view_Home.NewsExtendList = Dal.NewsDal.Instance(bangLi).GetInit().OrderByDescending(u => u.AddDateTime).Take(5).ToList();

        }
        return View(view_Home);
    }
    else
    {
        return null;
    }
}

说明:可以让一个超链接或跳转地址直接跳转到一个html的静态页面,速度会更快;

时间: 2024-10-05 09:10:20

ASP.NET MVC生成静态页面的相关文章

Asp.net 生成静态页面

第一次发表,有什么错误,请大家谅解噢! 如果不明白的话,建议自己拷一次. 就会的了.. 开发步骤: 1.路径映射类(UrlMapping),主要对路径进行拆分.拼接.(关键的一步) 2.过滤流类(FilterStream),主要负责生成静态页面. 3.静态页面类(HtmlPage),主要是调用UrlMapping和FilterStream类, 哪个页面想静态化,就继承这个类. 4.HtmlHandler类,路径后缀为Html的,都由它来处理,与HtmlPage类相似. 5.HtmlPanel类(

.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模板.缓存等实现页面静态化

比较详细PHP生成静态页面教程

一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对 脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器.由此不难看出,在页面发送到浏览器后,P