为BlogEngine的分类增加自定义Url别名功能
这次为BlogEngine的分类增加了自定义Url别名功能:
有疑问请留言,谢谢
修改代码:
BlogEngine.Core.Category.cs
在56行
private string _Title;
/// <summary>
/// Gets or sets the Title or the object.
/// </summary>
public string Title
{
get { return _Title; }
set
{
if (_Title != value) MarkChanged("Title");
_Title = value;
}
}
后添加:
private string _Slug;
/// <summary>
/// Gets or sets the Slug or the object.
/// </summary>
public string Slug
{
get { return _Slug; }
set
{
if (_Slug != value) MarkChanged("Slug");
_Slug = value;
}
}
public Category(string title, string description,string slug)
{
this.Id = Guid.NewGuid();
this._Title = title;
this._Description = description;
this._Slug = slug;
this.Parent = null;
}
修改BlogEngine.Core.Providers.Categories.cs的
public override void InsertCategory(Category category),
public override void UpdateCategory(Category category),
public override void DeleteCategory(Category category)这些方法中作相应的修改
foreach (Category cat in categories)
{
writer.WriteStartElement("category");
writer.WriteAttributeString("id", cat.Id.ToString());
writer.WriteAttributeString("description", cat.Description);
writer.WriteAttributeString("parent", cat.Parent.ToString());
writer.WriteAttributeString("slug", cat.Slug.ToString());//新增加的Url别名
writer.WriteValue(cat.Title);
writer.WriteEndElement();
cat.MarkOld();
}
修改public override List<Category> FillCategories()方法:
在
category.Id = new Guid(node.Attributes["id"].InnerText);
category.Title = node.InnerText;
后添加
if (node.Attributes["slug"] != null)
category.Slug = node.Attributes["slug"].InnerText;
else
category.Slug = string.Empty;
修改BlogEngine.Core.Web.HttpModules.UrlRewrite.cs中的private static void RewriteCategory(HttpContext context, string url)
private static void RewriteCategory(HttpContext context, string url)
{
string title = ExtractTitle(context, url);
foreach (Category cat in Category.Categories)
{
//string legalTitle = Utils.RemoveIllegalCharacters(cat.Title).ToLowerInvariant();
string legalTitle = Utils.RemoveIllegalCharacters(cat.Slug).ToLowerInvariant();
if (title.Equals(legalTitle, StringComparison.OrdinalIgnoreCase))
{
context.RewritePath(Utils.RelativeWebRoot + "default.aspx?id=" + cat.Id.ToString() + GetQueryString(context), false);
break;
}
}
}
修改BlogEngine.Web/App_Code/Controls/CategoryList.cs中private HtmlGenericControl BindCategories()这个方法
129行开始:
HtmlAnchor anc = new HtmlAnchor();
//anc.HRef = Utils.RelativeWebRoot + "category/" + Utils.RemoveIllegalCharacters(key) + BlogSettings.Instance.FileExtension;
anc.HRef = Utils.RelativeWebRoot + "category/" + Utils.RemoveIllegalCharacters(GetSlug(new Guid(dic[key].ToString()))) + BlogSettings.Instance.FileExtension;
anc.InnerHtml = HttpUtility.HtmlEncode(key) + postCount;
anc.Title = "Category: " + key;
修改BlogEngine.Web/admin/pages/Categories.aspx
在"<asp:TextBox runat="Server" ID="txtNewCategory" Width="200" /><br />"后添加:
<asp:Label ID="lblNewSlug" runat="server" AssociatedControlID="txtNewSlug" Text="Slug" /><br />
<asp:TextBox runat="Server" ID="txtNewSlug" Width="200" /><br />
在"
<asp:TemplateField HeaderText="<%$ Resources:labels, name %>">
<ItemTemplate>
<%# Server.HtmlEncode(Eval("title").ToString()) %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtTitle" Text='<%# Eval("title") %>' />
</EditItemTemplate>
</asp:TemplateField>
"后添加:
<asp:TemplateField HeaderText="Slug">
<ItemTemplate>
<%# Server.HtmlEncode(Eval("slug").ToString())%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtSlug" Text='<%# Eval("slug") %>' />
</EditItemTemplate>
</asp:TemplateField>
修改BlogEngine.Web/admin/pages/Categories.aspx.cs中 void btnAdd_Click(object sender, EventArgs e)这个方法
将Category cat = new Category(txtNewCategory.Text, description);改成
string slug = txtNewSlug.Text;
if (slug.Length > 255)
slug = slug.Substring(0, 255);
Category cat = new Category(txtNewCategory.Text, description, slug);
修改 void grid_RowUpdating(object sender, GridViewUpdateEventArgs e)方法:

















到这里就修改完成了,改的东西有点多,比较烦,因为我打算对BlogEngine进行比较多的修改,所以暂时不提供修改的文件下载,等感觉改得差不多了再提供下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述