asp.net生成静态页并分页+ubb第1/2页

下面是详细讲解“asp.net生成静态页并分页+ubb第1/2页”的完整攻略:

一、准备工作

  1. 首先,在项目中添加一个类,用于生成静态页和分页。
  2. 然后,通过NuGet安装Markdig包,用于将UBB代码转换为HTML格式。
  3. 接下来,设置web.config文件,开启压缩和缓存页面。

二、生成静态页

  1. 在类中创建一个名为GenStaticPage的方法,用于生成静态页。
  2. 在方法中调用ASP.NET的页面渲染方法Render,并将输出的内容保存为HTML文件。
  3. 通过HttpRequest的IsLocal属性判断是否为本地调试环境,如果是,则不生成静态页。

示例代码如下:

public static void GenStaticPage(HttpContext context, string fileName, string content)
{
    if (!context.Request.IsLocal)
    {
        context.Response.Clear();
        context.Response.ContentType = "text/html";
        var page = new Page();
        var control = page.ParseControl(content);
        page.Controls.Add(control);
        control.DataBind();
        var writer = new HtmlTextWriter(new StreamWriter(fileName, false, Encoding.UTF8));
        page.RenderControl(writer);
        writer.Close();
        context.Response.WriteFile(fileName);
        context.Response.End();
    }
}

三、分页

  1. 创建一个名为Pager的控件,用于分页。
  2. 在Pager控件中定义StartRowIndex和PageSize属性,用于控制分页。
  3. 修改数据查询语句,将查询结果按照StartRowIndex和PageSize进行分页。
  4. 修改页面URL,将分页参数添加到URL中。
  5. 在Pager控件中定义Render方法,用于渲染分页控件。
  6. 在Render方法中渲染分页HTML代码并返回。

示例代码如下:

public class Pager : WebControl
{
    public int StartRowIndex { get; set; }
    public int PageSize { get; set; }

    public void Render(HtmlTextWriter writer)
    {
        writer.Write("<div class=\"pager\">");
        writer.Write("<ul>");

        int pageCount = PageCount;
        if (pageCount == 1)
        {
            writer.Write("<li>1</li>");
        }
        else
        {
            if (PageIndex > 1)
            {
                // 第一页
                writer.Write("<li><a href=\"" + GetPageUrl(1) + "\">1</a></li>");
                // 上一页
                writer.Write("<li><a href=\"" + GetPageUrl(PageIndex - 1) + "\">上一页</a></li>");
            }

            // 中间页码
            for (int i = 2; i < pageCount; i++)
            {
                if (PageIndex - 2 <= i && i <= PageIndex + 2)
                {
                    if (PageIndex == i)
                    {
                        writer.Write("<li class=\"current\">" + i + "</li>");
                    }
                    else
                    {
                        writer.Write("<li><a href=\"" + GetPageUrl(i) + "\">" + i + "</a></li>");
                    }
                }
                else if (i < PageIndex - 2 && i > 1)
                {
                    writer.Write("<li><a href=\"" + GetPageUrl(i) + "\">" + i + "</a></li>");
                    writer.Write("<li class=\"disabled\">...</li>");
                    i = PageIndex - 3;
                }
                else if (i > PageIndex + 2 && i < pageCount - 1)
                {
                    i = pageCount - 2;
                    writer.Write("<li class=\"disabled\">...</li>");
                    writer.Write("<li><a href=\"" + GetPageUrl(i) + "\">" + i + "</a></li>");
                }
            }

            if (PageIndex < pageCount)
            {
                // 下一页
                writer.Write("<li><a href=\"" + GetPageUrl(PageIndex + 1) + "\">下一页</a></li>");
                // 最后一页
                writer.Write("<li><a href=\"" + GetPageUrl(pageCount) + "\">" + pageCount + "</a></li>");
            }
        }

        writer.Write("</ul>");
        writer.Write("</div>");
    }

    private int PageCount
    {
        get
        {
            int rowCount = GetRowCount();
            int pageCount = (rowCount % PageSize == 0) ? rowCount / PageSize : (rowCount / PageSize) + 1;
            return pageCount;
        }
    }

    private int PageIndex
    {
        get
        {
            int pageIndex = 1;
            if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["page"]))
            {
                pageIndex = int.Parse(HttpContext.Current.Request.QueryString["page"]);
            }
            return pageIndex;
        }
    }

    private string GetPageUrl(int pageIndex)
    {
        string url = HttpContext.Current.Request.RawUrl;
        url = Regex.Replace(url, "\\?page=\\d+", string.Empty);
        if (url.Contains("?"))
        {
            url += "&page=" + pageIndex;
        }
        else
        {
            url += "?page=" + pageIndex;
        }
        return url;
    }

    private int GetRowCount()
    {
        int rowCount = 0;
        string sql = "SELECT COUNT(*) FROM MyTable";
        using (var conn = new SqlConnection("连接字符串"))
        {
            conn.Open();
            using (var cmd = new SqlCommand(sql, conn))
            {
                rowCount = (int)cmd.ExecuteScalar();
            }
        }
        return rowCount;
    }
}

四、UBB第1/2页

  1. 在页面中引用Pager控件,并设置StartRowIndex和PageSize属性。
  2. 在页面中将UBB代码转换为HTML,然后使用Pager控件进行分页。
  3. 在UBB控件中定义Render方法,根据页码输出相应的HTML代码。

示例代码如下:

<div class="content">
    <% var content = "[b]这是一段UBB代码[/b]"; %>
    <%=Markdown.ToHtml(content)%>

    <%
        var pager = new Pager { StartRowIndex = 0, PageSize = 5 };
        pager.Render();
    %>

    <div class="ubbpager1">
        <% new UBB(content).RenderPage(1); %>
    </div>

    <div class="ubbpager2">
        <% new UBB(content).RenderPage(2); %>
    </div>
</div>
public class UBB : WebControl
{
    private readonly string _content;

    public UBB(string content)
    {
        _content = content;
    }

    public void RenderPage(int page)
    {
        var html = Markdown.ToHtml(_content);
        Response.Write(GetPageContent(html, page));
    }

    private static string GetPageContent(string html, int page)
    {
        string content = string.Empty;
        var match = Regex.Match(html, "</p>", RegexOptions.IgnoreCase);
        var index = match.Index;
        if (page != 1)
        {
            match = Regex.Match(html, "<p.*?>(.*?)</p>", RegexOptions.IgnoreCase);
            if (match.Success)
            {
                content = match.Groups[1].Value;
                index = match.Index;
            }
            else
            {
                content = html.Substring(index);
            }
        }
        var endIndex = index;
        for (int i = 0; i < page - 1; i++)
        {
            match = Regex.Match(html, "<p.*?>(.*?)</p>", RegexOptions.IgnoreCase, new TimeSpan(0, 0, 0, 1, 0));
            if (match.Success)
            {
                content += match.Groups[1].Value;
                endIndex = match.Index + match.Length;
            }
            else
            {
                endIndex = index;
                break;
            }
        }
        if (endIndex >= html.Length)
        {
            return content;
        }
        return content + "<div class=\"newpage\">" + html.Substring(endIndex) + "</div>";
    }
}

至此,asp.net生成静态页并分页+ubb第1/2页的完整攻略就讲解完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net生成静态页并分页+ubb第1/2页 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# GetType():获取当前实例的 Type

    当我们在C#中处理对象时,我们通常需要了解对象的类型信息。其中一个方法是 GetType()。GetType() 方法是一个Object类的实例成员。它返回Type对象,该对象提供了有关指定对象的数据类型的信息。 以下是使用 GetType() 方法的示例代码: using System; namespace GetTypeDemo { class Prog…

    C# 2023年4月19日
    00
  • C#中把Json数据转为DataTable

    让我们来介绍如何在C#中将Json数据转换为DataTable。在此之前需要先引入Newtonsoft.Json这个第三方库,可以通过NuGet安装。以下是详细步骤: 1. 读取Json数据 首先我们需要读取Json数据。可以从文件或Web API获取Json数据。以下是从文件读取Json数据的示例: using System.IO; string path…

    C# 2023年5月31日
    00
  • C#中的三种定时计时器Timer用法介绍

    下面我将为你详细讲解C#中的三种定时计时器Timer用法介绍的完整攻略。 1. 定时器Timer是什么? 定时器是一种常见的应用场景,比如日常使用的Android/IOS系统中的闹钟提醒功能、计数器功能等都需要定时器的支持。而在C#中,我们也可以使用定时器来实现某些需要定时执行的任务。 2. C#中的三种定时计时器Timer用法介绍 C#中,提供了三种常见的…

    C# 2023年6月1日
    00
  • C#编程实现Excel文档中搜索文本内容的方法及思路

    C#编程实现Excel文档中搜索文本内容的方法及思路 在 C# 编程中,实现搜索 Excel 文档中的文本内容是一个常见的需求。本文将介绍如何使用 C# 进行 Excel 文档的搜索文本内容,并附带两个示例说明。 思路 实现搜索 Excel 文档中的文本内容,可以采用以下步骤: 打开需要搜索的 Excel 文档。 遍历 Excel 文档中的所有单元格,查找包…

    C# 2023年6月8日
    00
  • 基于SqlSugar的开发框架循序渐进介绍(27)– 基于MongoDB的数据库操作整合

    SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等数据库,非关系型数据库的MongoDB数据库也可以作为扩展整合到开发框架里面,通过基类的继承关系很好的封装了相关的基础操作功能,极大的减少相关处理MongoDB的代码,并提供很好的开…

    C# 2023年4月17日
    00
  • WPF通过线程使用ProcessBar的方法详解

    以下是“WPF通过线程使用ProcessBar的方法详解”的完整攻略: WPF通过线程使用ProcessBar的方法详解 概述 在WPF应用程序中使用ProcessBar来显示进度是很常见的需求。但是,如果需要在处理耗时操作时更新进度,不能在UI线程中进行更新,否则会导致UI线程卡顿甚至崩溃。本攻略将介绍使用线程来更新ProcessBar的方法。 使用Sys…

    C# 2023年6月7日
    00
  • C#中通过反射将枚举元素加载到ComboBo的实现方法

    C#中通过反射将枚举元素加载到ComboBox的实现方法可以分为以下步骤: 1. 获取枚举类型 首先需要获取对应枚举类型,可以使用typeof关键字获取: Type enumType = typeof(MyEnumType); 也可以使用GetType方法获取: MyEnumType obj = new MyEnumType(); Type enumType…

    C# 2023年6月3日
    00
  • 10个C#程序员经常用到的实用代码片段

    下面我就来为大家详细讲解“10个C#程序员经常用到的实用代码片段”的完整攻略。 1. 字符串中查找是否存在指定字符示例 在C#中,我们经常需要查找字符串中是否存在指定的字符,可以用以下代码片段: bool isCharExist = myString.Contains("a"); 其中,myString为要搜索的字符串,”a”为要查找的字…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部