前些日子,在Post Blog文章到CS 2.1時發現一個問題,由於CS會試著以Post的標題(Subject)為基礎產生所謂的Post.Name屬性(放在資料表cs_Posts.PostName欄位),這個名稱可以拿來做為直接連結該篇Post的URL檔名。而它處理的原則是將Subject中的”無效字元”(嚴格來說是英文與數字以外的字元都被視為無效字元)排除,並轉為小寫,例如:

TIPS-XHTML下如何強制指定SPAN寬度” 變成 “tips xhtml span”,檔案名則是tips-xhtml-span.aspx

KB-Oracle轉SQL的日期陷阱”變成” kb oracle sql”,檔名則是kb-oralce-sql.aspx

當整個標題都是中文(無效字元)時,PostName會變成空字串,此時檔案名會改用PostID的數字取代。

問題出在如果兩篇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();

經修改後,未來只要是中英文夾雜的Subject,PostName一律設為空字串,檔案名會使用數字跳號,如此就不會有不同的標題確被認定重覆的狀況了。

2007-05-12 更新
好朋友Rex已經找到透過設定解決的方法了,不必再辛苦改Code,請看這裡


Comments

# by 小熊子

用 WLW 會出現 Server Error 0 Occurred The Post could not be added

Post a comment