将ViewState移动到页面底部的另一种方法
在网上有很多使用正则表达式将ViewState移动到页面底部的例子。 这是一种使用HtmlTextWriter的另一种方法。 你只需要在你的项目中添加一个名为MoveViewStateHtmlTextWriter的类,并在你的BasePage代码中编写以下代码:protected override...
在网上有很多使用正则表达式将ViewState移动到页面底部的例子。 这是一种使用HtmlTextWriter的另一种方法。 你只需要在你的项目中添加一个名为MoveViewStateHtmlTextWriter的类,并在你的BasePage代码中编写以下代码。
protected override HtmlTextWriter CreateHtmlTextWriter(System.IO.TextWriter tw) { return new MoveViewStateHtmlTextWriter(base.CreateHtmlTextWriter(tw)); }这是MoveViewStateHtmlTextWriter类的源代码
public class MoveViewStateHtmlTextWriter : HtmlTextWriter { enum State { None, WaitingKeyword, WaitingEnd, WaitingFormEnd, Finished } State _state = State.None; string lastString = null; StringBuilder _sb = new StringBuilder(); public MoveViewStateHtmlTextWriter(TextWriter inner) : base(inner) { } #region Overrides public override void Write(string s) { if (_state != State.WaitingFormEnd && _state != State.Finished) { if (_state == State.None) { // may be ViewState if (s == "\r\n<input type=\"hidden\" name=\"") { lastString = s; _state = State.WaitingKeyword; return; } // may be ViewState else if (s == "<input type=\"hidden\" name=\"") { lastString = s; _state = State.WaitingKeyword; return; } } else if (_state == State.WaitingKeyword) { if (s == "__VIEWSTATE") { _sb.Append(lastString); lastString = null; _sb.Append(s); _state = State.WaitingEnd; return; } else { _state = State.None; base.Write(lastString); lastString = null; } } else if (_state == State.WaitingEnd) { _sb.Append(s); return; } } base.Write(s); } public override void WriteLine(string s) { if (_state == State.WaitingEnd) { _sb.Append(s); if (s == "\" value=\"\" />" || s == "\" />") { _state = State.WaitingFormEnd; } return; } if (lastString != null) base.WriteLine(lastString); base.WriteLine(s); } public override void WriteEndTag(string tagName) { if (_state == State.WaitingFormEnd) { if (tagName == "form") { base.Write(_sb.ToString()); _sb.Remove(0, _sb.Length); _state = State.Finished; } } if (lastString != null) base.WriteLine(lastString); base.WriteEndTag(tagName); } #endregion }