BlogEngine.NET はバージョン 2.0 になって W3C Markup Validation Service にパスしなくなってしまいました。
原因は、以下のように、外部スクリプトファイルの定義にクエリ文字列 &minify= が追加されたことによります。& そのままでなく、HTML エンコードして & にしないとパスしません。
<script
type="text/javascript"
src="/BlogEngine2/js.axd?path=Scripts%2fblog.js&minify=">
</script>
<script
type="text/javascript"
src="/BlogEngine2/js.axd?path=%2fBlogEngine2%2fadmin%2fwidget.js&minify=">
</script>
この問題を解決するには、Core.Utils の ResolveScriptUrl メソッドを以下のように修正します。
public static string ResolveScriptUrl(string url, bool minify)
{
var minifyQuery = (minify ? "&minify=" : String.Empty);
//return string.Format("{0}js.axd?path={1}{2}",
// Utils.RelativeWebRoot,
// HttpUtility.UrlEncode(url),
// minifyQuery);
return string.Format("{0}js.axd?path={1}{2}",
Utils.RelativeWebRoot,
HttpUtility.UrlEncode(url),
HttpUtility.HtmlEncode(minifyQuery));
}
さらに、ページングする際に &page=n(n はページ番号)というクエリ文字列がページャーのリンクの URL に追加される場合があります。その場合はやはり W3C Markup Validation は通りません。この問題はバージョン 1.6.1 にもありましたが、今まで気がつきませんでした。(汗)
App_Code/Control/PostPager.cs の PageUrl メソッド
これはバージョン 2.0 のページャー用に追加されたものです(バージョン 1.6.1 にはありません)。
private static string PageUrl()
{
var path =
HttpContext.Current.Request.RawUrl.
Replace("Default.aspx", string.Empty);
if (path.Contains("?"))
{
if (path.Contains("page="))
{
var index = path.IndexOf("page=");
path = path.Substring(0, index);
}
else
{
// ここで単純に path += "&"; としてもダメ。
path += "&";
}
}
else
{
path += "?";
}
// これを追加。
path = path.Replace("&", "&");
return path + "page={0}";
}
User controls/PostList.ascx.cs の InitPaging メソッド
これはバージョン 2.0 と 1.6.1 両方にあります。バージョン 2.0 では、これを使うページャーは style="display: none" となっており表示はされませんが、html コードには現れてくるので修正が必要です。
private void InitPaging()
{
var path =
this.Request.RawUrl.Replace("Default.aspx", string.Empty);
path = path.Contains("?") ?
(path.Contains("page=") ?
path.Substring(0, path.IndexOf("page="))
: string.Format("{0}&", path))
: string.Format("{0}?", path);
var page = this.GetPageIndex();
var url = string.Format("{0}page={{0}}", path);
// 下記の追加のみ
url = url.Replace("&", "&");
this.hlNext.HRef = string.Format(url, page);
this.hlPrev.HRef = string.Format(url, page + 2);
if (page == 0)
{
this.hlNext.Visible = false;
}
else
{
((BlogBasePage)this.Page).AddGenericLink(
"next",
"Next page",
this.hlNext.HRef);
}
if (this.hlPrev.Visible)
{
((BlogBasePage)this.Page).AddGenericLink(
"prev",
"Previous page",
string.Format(url, page + 2));
}
}