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#实现语音视频录制-附demo源码

    标题:C#实现语音视频录制-附demo源码完整攻略 简介 本攻略旨在介绍如何使用C#实现语音视频录制的方法,并提供示例代码。该方法基于NAudio和AForge库,可以在Windows系统中实现对声音和视频的录制,并支持保存为MP4格式。 步骤 下载并安装NAudio和AForge库。 在项目中引用这两个库。 添加代码: private void Start…

    C# 2023年6月6日
    00
  • C# CopyTo(T[],Int32):从特定的索引开始将元素复制到数组中

    C#中的CopyTo(T[],Int32)方法是将调用该方法的数组中所有元素复制到另一个T类型数组中,从指定索引位置开始复制。其中,T表示要复制的数组元素的类型;Int32则表示复制的起始索引,该值可为0或其他正整数,但不得大于目标数组的长度。 该方法的完整格式为:public void CopyTo(T[] array, int index) 下面以两个示…

    C# 2023年4月19日
    00
  • C#中Invoke的用法讲解

    下面我来详细讲解一下C#中Invoke的用法。 1. 概述 在C#中,Invoke是一种利用委托类型对控件进行操作的方法,一般用于在多线程情况下更新控件的界面。 2. 使用方法 Invoke方法是Control类的一个方法,用于对控件进行操作。Invoke方法有两种使用方式,分别是同步方式和异步方式: 2.1 同步方式 在同步方式中,Invoke方法会在当前…

    C# 2023年5月15日
    00
  • C# params可变参数的使用注意详析

    C# params 可变参数的使用注意详析 什么是 params? C# 中的 params 关键字可以让我们定义一个可变长度参数列表。使用 params 关键字的方法可以接受零个或多个参数,参数在方法内部被视为数组,可以像普通数组一样进行访问。 使用 params 关键字定义的参数必须是方法的最后一个参数,而且一个方法只能拥有一个 params 关键字定义…

    C# 2023年5月15日
    00
  • C#多线程编程中的锁系统(三)

    当多个线程同时访问共享资源时,可能会导致数据的不一致性,从而影响程序的正确性和稳定性。为了解决这个问题,我们可以使用锁系统来保证共享资源在同一时刻只能被一个线程访问和修改。 在C#多线程编程中,锁系统通常使用lock关键字来实现。下面是使用lock关键字来实现的示例代码: public class Counter { private static objec…

    C# 2023年6月7日
    00
  • C#函数式程序设计之用闭包封装数据的实现代码

    当我们编写函数式程序时,往往需要通过一些手段来封装数据,保证程序的不变性和可维护性。而闭包就是这样一种手段。在C#中,可以使用匿名函数和Lambda表达式来实现闭包。 首先,让我们看看一个示例,该示例演示了如何使用闭包来封装数据。 public static Func<int> CreateCounter(int start, int step)…

    C# 2023年6月6日
    00
  • C#中的虚函数virtual

    当我们在派生类中重写基类的同名函数时,若基类指针或引用指向派生类对象,这时若基类函数被调用,会调用派生类中的函数而不是基类中的函数。但是,如果将基类指针或引用指向派生类对象的实例时,如果使用基类指针或引用来访问这个函数,则只会调用基类中的函数,而不会调用派生类中的函数。为了解决这个问题,C#中引入了虚函数virtual的机制。 虚函数用来实现多态,将基类中的…

    C# 2023年6月7日
    00
  • C#实现将PPT转换成HTML的方法

    下面是详细讲解“C#实现将PPT转换成HTML的方法”的完整攻略。 1. 环境准备 要完成将PPT转换成HTML的任务,需要用到以下工具和环境: Office Interop Assemblies 用于在C#中访问Office文档的API。 Visual Studio 用于编写和运行C#代码。 PowerPoint 用于打开和处理PPT文件。 在安装好Off…

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