前些日子,在Post Blog文章到CS 2.1時發現一個問題,由於CS會試著以Post的標題(Subject)為基礎產生所謂的Post.Name屬性(放在資料表cs_Posts.PostName欄位),這個名稱可以拿來做為直接連結該篇Post的URL檔名。而它處理的原則是將Subject中的”無效字元”(嚴格來說是英文與數字以外的字元都被視為無效字元)排除,並轉為小寫,例如:
問題出在如果兩篇Post的標題,英文的部分完全相同,只差在中文的部分,例如: “KB-ASP.NET 2.0專案部署探討”與”KB-ASP.NET 2.0效能議題”,二者所產生的PostName都是”kb asp net 2 0”,結果就會發生明明文章標題不同,CS卻一直跳出標題重覆的窘境。
為了解決這個問題,我小小地修改了CommunityServer.Blogs.Compnents.WeblogPosts的PostFormatting Method如下:
else if((post.BlogPostType == BlogPostType.Post || post.BlogPostType == BlogPostType.Article) && post.Weblog.AutoNamePosts)
{
string name = spacer.Replace(postNameInvalidChars.Replace(post.Subject, " "), " ").Trim().ToLower();
//2007-02-09 by Jeffrey Lee
//If subject contains both Chinese and English, set empty string
if ( name.Length > 0 //means subject contains English character
&& System.Text.Encoding.UTF8.GetByteCount(post.Subject) != post.Subject.Length //means subject contains non-English characters
)
name = ""; //set it as empty string, CS will use serial number as file name
if(name.Length > 225)
name = name.Substring(0,225).Trim();