by WebSurfer
2011年6月13日 22:58
ページングする際に &page=n(n はページ番号)というクエリ文字列がページャーのリンクの URL に追加
される場合があります。しかしながら、& のままでは W3C Markup Validation に通りません。HTML エンコー
ドして & にする必要があります。この問題には今まで気がつきませんでした。(汗)
この問題を解決するには、User controls/PostList.ascx.cs の InitPaging メソッドを以下のように修正しま
す。
private void InitPaging()
{
string path = Request.RawUrl;
if (!(Request.QueryString["year"] != null ||
Request.QueryString["date"] != null))
path = REMOVE_DEFAULT_ASPX.Replace(path, string.Empty);
if (path.Contains("?"))
{
if (path.Contains("page="))
{
int index = path.IndexOf("page=");
path = path.Substring(0, index);
}
else
{
path += "&";
}
}
else
{
path += "?";
}
int page = GetPageIndex();
string url = path + "page={0}";
// 下記の追加のみ
url = url.Replace("&", "&");
hlNext.HRef = string.Format(url, page);
hlPrev.HRef = string.Format(url, page + 2);
if (page == 0)
{
hlNext.Visible = false;
}
else
{
(Page as BlogBasePage).AddGenericLink(
"next",
"Next page",
hlNext.HRef);
Page.Title += " - Page " + (page + 1);
}
if (hlPrev.Visible)
(Page as BlogBasePage).AddGenericLink(
"prev",
"Previous page",
string.Format(url, page + 2));
}
by WebSurfer
2010年7月28日 14:43
ASP.NET の ImageButton コントロールを配置したページを W3C Markup Validation Service で検証すると、「あなたが使用しているドキュメントタイプではサポートされていない属性(border="0")が使われている」というエラーが出ます。
ドキュメントタイプは ASP.NET のデフォルトで、XHTML 1.0 Transitional と宣言しています。border 属性の使用は、Strict ではダメですが、Transitional では許されているはずなんですが・・・
それはともかく、オリジナルの *.aspx コードにはそのような属性を指定していないにも関わらず、何故 ASP.NET が border="0" という古い属性のコードを書き出すのでしょう?
それは、W3C Markup Validation Service から ASP.NET が要求を受けた際、要求元を古いブラウザと解釈するからだそうです。
ちなみに、IE8 や Firefox 3.6.7 などの新しいブラウザから同じページを要求すると、style="border-width:0px;" となって、XHTML1.0 Strict でも有効な HTML/CSS のコードになります。
この件は ASP.NET Forum にもレポートされていて、回避策も書かれています。リンク切れになると困るのでここにもその回避策を書いておきます。(2011/8/20追記: MSDN ライブラリ にも対応方法が書いてありました。下の追記参照)
アプリケーション・ルート直下に App_Browsers フォルダを設け、その中に以下の内容の .browser ファイルを配置します。これによって ASP.NET は W3C Markup Validation Service に対して IE8 や Firefox 3.6.7 と同じコードを送信するようになるはずです。
<browsers>
<browser id="w3cValidator" parentID="default">
<identification>
<userAgent match="^W3C_Validator" />
</identification>
<capture>
<userAgent match="^W3C_Validator/(?'version'(?'major'\d+)(?'minor'\.\d+)\w*).*" />
</capture>
<capabilities>
<capability name="browser" value="w3cValidator" />
<capability name="majorversion" value="${major}" />
<capability name="minorversion" value="${minor}" />
<capability name="version" value="${version}" />
<capability name="w3cdomversion" value="1.0" />
<capability name="xml" value="true" />
<capability name="tagWriter" value="System.Web.UI.HtmlTextWriter" />
</capabilities>
</browser>
</browsers>
なお、上記は ASP.NET 3.5 の話で、ASP.NET 4.0 でどうなっているかは未確認です。
------ 2011/8/20 追記 ------
MSDN ライブラリの Visual Studio と ASP.NET の XHTML 標準 の「マークアップ検証に対するブラウザー機能の構成」というセクションに、本件に関する記述がありました。
.NET Framework 4 の記事なので、サーバを ASP.NET 4 にアップグレードしても、ブラウザー定義を追加しての対応は必要なようです。
なお、そこで紹介されている W3C 検証用のブラウザ定義は以下の通りです。
<browsers>
<browser id="W3C_Validator" parentID="default">
<identification>
<userAgent match="^W3C_Validator" />
</identification>
<capabilities>
<capability name="browser" value="W3C Validator" />
<capability name="ecmaScriptVersion" value="1.2" />
<capability name="javascript" value="true" />
<capability name="supportsCss" value="true" />
<capability name="tables" value="true" />
<capability name="tagWriter"
value="System.Web.UI.HtmlTextWriter" />
<capability name="w3cdomversion" value="1.0" />
</capabilities>
</browser>
</browsers>
W3C のホームページの User's guide for the W3C Markup Validator によると、通常の User-Agent は W3C_Validator/xx.xxxx とのことなので、MSDN ライブラリのブラウザ定義の方が適切だと思います。