問題
WebFormsを使用する場合、ViewStateとの闘いを続けます(このテクノロジーの使用は、会社のプロジェクトでWCSFパターンを使用する
前の記事で、 ViewStateをユーザーのブラウザーからセッションに移動する可能性について検討しました。 ページ上のViewStateを削除できたのは素晴らしいことですが、この方法では、状態サーバーの再起動に問題が発生する場合があります(ただし、経験豊富な友人は遭遇しませんでした)。
それでもViewStateをブラウザ側に残すことに決めた場合、(肥大化したhtmlに加えて)別の問題が発生します-ceteris paribus、検索エンジンはページの上部に近いほど情報をランク付けします。 当然、各ページの先頭に巨大なViewStateが存在することは望ましくありません。
解決策
したがって、必要なのは、出力ストリームをインターセプトし、ページの上部からViewStateで非表示フィールドを切り取り、フォームの終了タグの前に挿入することだけです。
ページアダプタを書きましょう:
using System.IO;
using System.Web.UI;
namespace MyCompany.Web
{
/// <summary>
/// ViewState
/// </summary>
public class MoveViewStatePageAdapter : System.Web.UI.Adapters.PageAdapter
{
protected override void Render(HtmlTextWriter writer)
{
// HTML,
var sw = new StringWriter ();
var hw = new HtmlTextWriter(sw);
base .Render(hw);
var html = sw.ToString();
hw.Close();
sw.Close();
// ViewState
var start = html.IndexOf( @"<input type=" "hidden" " name=" "__VIEWSTATE" "" );
if (start > -1)
{
var end = html.IndexOf( "/>" , start) + 2;
// ViewState
var viewstate = html.Substring(start, end - start);
html = html.Remove(start, end - start);
// ViewState
var formend = html.IndexOf( "</form>" ) - 1;
html = html.Insert(formend, viewstate);
}
// HTML
writer.Write(html);
}
}
}
* This source code was highlighted with Source Code Highlighter .
App_Browsersフォルダーで、コンテンツを含むdefault.browserファイルを作成します。
< browsers >
< browser refID ="Default" >
< controlAdapters >
< adapter controlType ="System.Web.UI.Page" adapterType ="MyCompany.Web.MoveViewStatePageAdapter" />
</ controlAdapters >
</ browser >
</ browsers >
* This source code was highlighted with Source Code Highlighter .
結果を見てください!
PS ViewStateをページの下部に移動するコードを使用しました
httpモジュールを使用する別のソリューション 。