четвер, 24 грудня 2009 р.

Открытый тренинг Happy PM

Несколько недель назад посетил открытый тренинг Happy PM
   Управление командой (1 день, 8 часов)
   Построение карьеры (1 день, 8 часов)
На мой взгляд, очень позитивный тренинг, дает понимание многих неочевидных вещей в общении с подчиненными и понимание как и куда правильно рости.
Поетому все кому не равнодушна судьба своих подчиненных и личная карьера, настоятельно рекомендую посетить.

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

Кроссбраузерный "Content-Disposition" "attachment; filename"

Наверняка всем знаком заголовок "Content-Disposition" со значением "attachment; filename".  Казалось бы, что может быть проще. Но оказывается и здесь есть свои нюансы. Для меня эти нюансы вылились в то, что при тестировании нормально filename определяла только Opera. Ослик сохранял файл с именем вида B_0JzQsNC70YzRh9C40LrQ. FireFox при сохранении файлов в именах которых содержатся пробелы, сохранял файл с частъю имени до первого пробела.
Впрочем проблемы возникали не только у меня:
1) http://softwaremaniacs.org/forum/django/14097/
2) http://sql.ru/forum/actualthread.aspx?tid=584761
3) http://www.gotdotnet.ru/forums/4/61117/294999/#post294999
но работающего решения так и не было найдено.
После более детального изучения проблемы и "доработки напильником" выяснилось, что IE понимает не ASCII имена файлов только в формате URL Encoding. А FireFox единственный который нуждается в обрамлении имени файла двойными ковычками. Таким образом получили работающий кроссбраузреный attachment; filename. Код выглядит следующим образом:


                string fileName = fileInfo.Name;
                if (IsIE(Request.Browser))
                {
                    fileName = Server.UrlEncode(fileInfo.Name);
                    if (fileName != null) fileName = fileName.Replace(@"+", @"%20");
                }

                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");

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

Как подружить 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