下面是详细讲解“asp.net生成静态页并分页+ubb第1/2页”的完整攻略:
一、准备工作
- 首先,在项目中添加一个类,用于生成静态页和分页。
- 然后,通过NuGet安装Markdig包,用于将UBB代码转换为HTML格式。
- 接下来,设置web.config文件,开启压缩和缓存页面。
二、生成静态页
- 在类中创建一个名为GenStaticPage的方法,用于生成静态页。
- 在方法中调用ASP.NET的页面渲染方法Render,并将输出的内容保存为HTML文件。
- 通过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();
}
}
三、分页
- 创建一个名为Pager的控件,用于分页。
- 在Pager控件中定义StartRowIndex和PageSize属性,用于控制分页。
- 修改数据查询语句,将查询结果按照StartRowIndex和PageSize进行分页。
- 修改页面URL,将分页参数添加到URL中。
- 在Pager控件中定义Render方法,用于渲染分页控件。
- 在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页
- 在页面中引用Pager控件,并设置StartRowIndex和PageSize属性。
- 在页面中将UBB代码转换为HTML,然后使用Pager控件进行分页。
- 在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技术站