65.9K
CodeProject 正在变化。 阅读更多。
Home

将ViewState移动到页面底部的另一种方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (4投票s)

2010 年 4 月 20 日

CPOL
viewsIcon

12163

在网上有很多使用正则表达式将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
}
© . All rights reserved.