WebSurfer's Home

トップ > Blog 2   |   Login
Filter by APML

W3C 検証にパスしない

by WebSurfer 13. June 2011 23:23

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 += "&amp;"; としてもダメ。
      path += "&";
    }
  }
  else
  {
    path += "?";
  }

  // これを追加。
  path = path.Replace("&", "&amp;");

  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("&", "&amp;");

  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));
  }
}

Tags:

BlogEngine.NET 2.0

About this blog

ここブログ2は趣味など日常のトピックス、ブログ1 は ASP.NET Web アプリ開発関係のトピックスになっています。

Calendar

<<  January 2021  >>
MoTuWeThFrSaSu
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

View posts in large calendar