Хорошо, Джон, сначала проблема с состоянием просмотра:
Я не проверял, есть ли какое-либо внутреннее изменение кода с 2.0, но вот как я справился с избавлением от состояния представления несколько лет назад. На самом деле это скрытое поле жестко запрограммировано внутри HtmlForm, поэтому вы должны получить новое и перейти к его рендерингу, совершая вызовы самостоятельно. Обратите внимание, что вы также можете не указывать __eventtarget и __eventtarget, если вы придерживаетесь простых старых элементов управления вводом (что, я думаю, вы захотите, поскольку это также помогает не требовать JS на клиенте):
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 и вызываете их, пропуская ту часть состояния представления;)
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...
}
Я думаю, это в значительной степени так. Дайте мне знать, как это происходит.
РЕДАКТИРОВАТЬ: я забыл методы просмотра состояния страницы:
Итак, ваша пользовательская форма: 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;
}
В этом случае я опечатываю методы, потому что вы не можете запечатать Страницу (даже если она не абстрактна, Скотт Гатри свернет ее в еще одну: P), но вы можете запечатать свою Форму.