Я знаю, что этот пост старый, но у меня тоже недавно была эта проблема.
После проверки того, как был сгенерирован код для asp: ButtonField, а также для asp: Button, который я добавил в ItemTemplate, я обнаружил довольно большую разницу:
жерех: ButtonField:
input type = "button" onclick = "javascript: __ doPostBack ('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails', 'SendFromBatch $ 0')" value = "Продолжить">
жерех: кнопка:
input id = "ctl00_ctl00_cphMain_cphContent_gvEmails_ctl02_btnCont" type = "submit" onclick = "FreezeScreen ('письма отправляются ...');" value = "Продолжить" name = "ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails $ ctl02 $ btnCont">
Тип был проблемой! Итак, после того как я изменил UseSubmitBehavior с «Submit» на «False», я больше не получил ошибку.
EDIT:
Недавно я хотел перейти с обычных btns на imgBtns, чтобы сэкономить место и сделать сетку более приятной: D. Конечно, у меня возникла та же проблема, и у imagebtn нет свойства UseSubmitBehavior, поэтому я начал искать решение.
Найдено следующее (код ниже находится в UserControl).
1) Привязать! IsPostBack
2) Зарегистрировать сам пользовательский контроль в Render
и все работает так, как запланировано - без ошибок проверки.
protected void Page_Load(object sender, EventArgs e)
{
OnLoadingEvent(new EventArgs());
if (!Page.IsPostBack)
{
gvEmails.DataSource = odsEmails;
try
{
gvEmails.DataBind();
}
catch (Exception)
{
}
}
if (!writeText) divWriteEmail.Visible = false;
}
protected override void Render(HtmlTextWriter writer)
{
Page.ClientScript.RegisterForEventValidation(this.UniqueID);
base.Render(writer);
}
EDIT:
Я поигрался с приведенным выше кодом и спросил себя, что, если вам действительно нужно перебросить свой объектный источник данных - что произойдет потом? Хорошо, приведенный выше код не будет работать, если вы перепривязываете при загрузке страницы, потому что представление сетки будет восстановлено снова, когда вы нажмете btn в строке вида сетки, и оно не будет распознано как созданное на сервере. Справедливо и справедливо, но как избежать такого поведения? Ну ... я нашел способ, может быть, не самый лучший, но он делает свое дело.
На самом деле, вы не хотите перепривязывать сетку, когда щелкаете btn в строке gv ... но как мы узнаем, что, поскольку метод загрузки страницы вызывается впервые? Ну, на самом деле я не хочу перепривязывать вид сетки, если параметр выбора источника данных объекта не изменяется. Поэтому я сохраняю параметр выбора объекта objectDataSource в виде сеанса и перепривязываю свой вид сетки только при изменении одного из них - это происходит только во время события PageLoad. Чтобы увидеть последние строки, я нажимаю кнопку «Обновить» и получаю последние строки без проблем, а в данный момент я нажимаю gvRow btn, ошибка исчезает.
Чтобы все это произошло, вам нужно
- Непосредственный вызов .Select () источника данных объекта
- Поймать событие OnSelecting из источника данных, сохранить параметр выбора и установить e.Cancel = true
- Проверьте, отличаются ли параметры выбора, и затем привязайте сетку, и на этот раз при перехвате OnSelecting вы должны установить e.Cancel = false, чтобы получить данные из БД - только один раз.
Надеюсь, это поможет!