好的,乔恩,viewstate问题首先出现了:
自2.0以来,我还没有检查过内部代码是否有任何变化,但是几年前我是按照这种方式摆脱视图状态的。实际上,该隐藏字段是在HtmlForm中进行硬编码的,因此您应该派生新字段,并逐步进行渲染,由您自己进行调用。请注意,如果您坚持使用普通的旧输入控件(我想您也希望这样做,因为它也有助于在客户端上不需要JS),您也可以将__eventtarget和__eventtarget留在外面:
protected override void RenderChildren(System.Web.UI.HtmlTextWriter writer)
{
System.Web.UI.Page page = this.Page;
if (page != null)
{
onFormRender.Invoke(page, null);
writer.Write("<div><input type=\"hidden\" name=\"__eventtarget\" id=\"__eventtarget\" value=\"\" /><input type=\"hidden\" name=\"__eventargument\" id=\"__eventargument\" value=\"\" /></div>");
}
ICollection controls = (this.Controls as ICollection);
renderChildrenInternal.Invoke(this, new object[] {writer, controls});
if (page != null)
onFormPostRender.Invoke(page, null);
}
因此,您获得了这3个静态MethodInfo并调用它们,从而跳过了该viewstate部分;)
static MethodInfo onFormRender;
static MethodInfo renderChildrenInternal;
static MethodInfo onFormPostRender;
这是表单的类型构造函数:
static Form()
{
Type aspNetPageType = typeof(System.Web.UI.Page);
onFormRender = aspNetPageType.GetMethod("OnFormRender", BindingFlags.Instance | BindingFlags.NonPublic);
renderChildrenInternal = typeof(System.Web.UI.Control).GetMethod("RenderChildrenInternal", BindingFlags.Instance | BindingFlags.NonPublic);
onFormPostRender = aspNetPageType.GetMethod("OnFormPostRender", BindingFlags.Instance | BindingFlags.NonPublic);
}
如果我的问题是对的,那么您也不想将POST用作表单的操作,因此可以按照以下步骤进行操作:
protected override void RenderAttributes(System.Web.UI.HtmlTextWriter writer)
{
writer.WriteAttribute("method", "get");
base.Attributes.Remove("method");
// the rest of it...
}
我想这差不多了。让我知道事情的后续。
编辑:我忘记了页面viewstate方法:
因此,您的自定义Form:HtmlForm获得了全新的摘要(或没有)Page:System.Web.UI.Page:P
protected override sealed object SaveViewState()
{
return null;
}
protected override sealed void SavePageStateToPersistenceMedium(object state)
{
}
protected override sealed void LoadViewState(object savedState)
{
}
protected override sealed object LoadPageStateFromPersistenceMedium()
{
return null;
}
在这种情况下,我密封了方法,因为您无法密封Page(即使它不是抽象的,Scott Guthrie也会将其包装到另一个:P中),但是您可以密封表格。