пʼятниця, 4 грудня 2009 р.

Как подружить DefaultButton и ValidationSummary?

Недавно, на одном из моих веб проектов, мне довелось добавить функционал "кнопки по умолчанию". Тоесть при нажатии пользователем в браузере кнопки Enter, должно происходить определенно действие. Как известно, начиная с ASP.NET 2.0 у елементов Form и Panel присутствует свойство DefaultButton, которым я и решил воспользоватся. Но как оказалось, радость от простоты и удобства декларативного задания кнонпки была не долгой. 
Выяснилось, что при использовании этого свойства совместно с валидаторами последние отрабатывают нестандартно. Тоесть если ввести неверное значение в поле ввода и нажать Enter, то валидатор срабатывает и даже показывает текст об ошибке, но сообщение об ошибке не отображается в ValidationSummary. Хотя если нажать на кнопку при помощи мышки, то сообщение попадает в ValidationSummary. После недолгого "гугления" оказалось что проблема не нова, но решение так и не найдено:
1) http://forums.asp.net/p/1100563/1868707.aspx
2) http://www.sql.ru/Forum/actualthread.aspx?bid=19&tid=557039&hl=
3) http://www.aspnetmania.com/Forums/ForumMessage/395492.html
   После более детального изучения проблемы выяснилось, что конструкция
< asp:Panel ID="Panel1" runat="server" DefaultButton="btnFind">
превращается в
<div id="ctl00_cphMain_Panel1" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_cphMain_btnFind')">
Но к несчастью простых разработчиков, JavaScript событие onkeypress поля ввода переопределено валидатором, контролирующим данное поле. Таким образом при вводе неверной информации и нажатии на кнопку Enter срабатывает валидатор, который отображает текст ошибки и прекращает обработку события.
Таким образом, что бы победить это "зло" достаточно просто привязатся к другому событию. В данном случае это будет keydown. Выглядеть это будет примерно так:

pnlAsset.Attributes.Add("onkeydown", "javascript:return WebForm_FireDefaultButton(event, '" + btnFind.ClientID + "')");


Работает для IE8, FF3.5.5, Opera 10.10

1 коментар: