Появилась необходимость реализовать механизм анонимной оценки статей, записей и т.п., который бы, по возможности, максимально блокировал вторичное выставление оценки: либо предотвращал вторичное оценивание либо менял предыдущую оценку.
Использовать решил evercookie («неубиваемые» куки), поэтому эта запись станет своеобразным продолжением предыдущей с исправлением ошибок.
Читать дальше »
Данный сабж возникает в тех случаях, когда на странице есть UpdatePanel, причем неважно в ней капча или нет, или просто выполняется ajax-запрос на сервер.
Решение: качайте новую версию капчи, желательно последнюю (2.0.15), а то промучаетесь над тем, что в старых версиях бажило.
Ещё раз убедился в правильности слов: «век живи, век учись», перелистывая книгу по ASP.NET + понял, что весьма прилично отстал, причём не один: поспрашивал коллег — они как бы тоже не в курсе были.
Как оказалось на странице можно сделать метод, к которому запросто обращаться из клиентского кода и «нахаляву» получать результат, который метод возвращает. Наряду с этим можно к этому же методу обратиться и с помощью jQuery.
Читать дальше »
Сегодня столкнулся с абсурдной на мой взгляд ситуацией: поставил на странице капчу BotDetect (далее captcha), TextBox и кнопку.
В обработчике клика по кнопке на серверной стороне использую дважды метод Validate капчи (captcha), передавая ему в качестве параметра текст из TextBox’а.
Результат ошеломляет: при первом вызове (captcha.Validate) метод возвращает true, при повторном — false.
Интересно, это у них в документации отмечено.
Столкнулся со следующей ситуацией: на странице есть RadAsyncUpload, по ajax’у замечательно загружает файлы на сервер, но как только добираемся потом до постбека, получаем исключение: File Could not find file путьApp_DataRadUploadTempимя_временного_файла.
Исключение вылетает в обработчике событии OnFileUploaded при обращении к e.File.InputStream, которое вылезает при постебеке.
Телерики предлагают обновить Telerik.Web.UI.dll на более новую, но у меня решение нашлось почти что случайно: на одном из форумов предположили, что такое поведение связано со свойством RadAsyncUpload TargetFolder или PhysicalTargetFolder.
Поясню. Дело в том, что когда данные свойства заданы, то файл не помещается в темповую папку, он попадает туда куда ему указали, а когда мы работаем с e.File.InputStream, то он как раз работает с файлами во временном каталоге аплоадера, которого получается что там нет – отсюда ошибка.
Так что либо не указываем значения свойств и сохраняем файл самостоятельно через SaveAs либо видимо не работаем с e.File.InputStream.
Я выбрал первое и ошибка пропала.
Достаточно известная как оказалось ошибка, но мне ранее не известная. Вообщем, ситуация такая: загружается файл, сохраняется при возникновении события OnFileUploaded с помощью e.File.InputStream. Далее пытаюсь дёрнуть сохранённый файл и получаю 500: The process cannot access the file because it is being used by another process.
Как выяснилось проблема состоит в том, что e.File.InputStream каждый раз создаёт новый экземпляр и поэтому вызываемый после сохранения файла метод Close не закрывает экземпляр с помощью которого получили данные, а закрывает другой новый, только что созданный.
Так что тактика простая:
Stream stream = e.File.InputStream;
/* много кода*/
stream.Close();
Вот собственно и всё, работает.
Недавно столкнулся с тем, что при попытке загрузить файл с помощью RadAsyncUpload’а от telerik’ов на сервер из сети, в которой используется прокси весьма проблематично из браузеров отличных от IE.
Проблема заключается в появлении окна, запрашивающего авторизацию. После ввода окно больше не выводится, но и файл не загружается, а порой браузер вообще подвисает.
Решение, есстественно, имеется, а проблема кроется в флеше: именно его использует RadAsyncUpload по умолчанию. Вообщем, в коде страницы выше того места, где используется RadAsyncUpload, пишем:
Telerik.Web.UI.RadAsyncUpload.Modules.Flash.isAvailable = function() { return false; }
В принципе, ничего на вид не меняется, получаем обычный input типа file, работающий через ajax, но авторизация уже не запрашивается.
Напомню пейджинг – это контрол, который служит для навигации между страницами, допустим раздела со списокм новостей. Сие требуется почти на любом сайте и проекте, поэтому оптимальнее всего написать либо контрол либо HtmlHelper для MVC-проектов.
Последнее реализуется достаточно просто, главное – учесть все параметры, которые вам когда -либо нужно будет задавать. Например, я написал следующий хелпер для пейджинга, который и использую:
public static class CustomHelpers
{
public static string Paging
(this HtmlHelper helper,
int page,
int itemPrePage,
int itemCount,
int showItemsCount,
string itemTag,
string moreText,
string nextText,
string prevText,
string firstText,
string lastText,
bool IsFirstLast,
string pageLinkText,
string rootLink,
string anchorText
)
{
int pagesCount
= itemCount
% itemPrePage
== 0 ? itemCount
/ itemPrePage
: itemCount
/ itemPrePage
+ 1;
if ( pagesCount
< 2)
return "";
StringBuilder sb
= new StringBuilder
();
if (IsFirstLast
&& page
> 1)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "",
1, pageLinkText, firstText
);
if (page
> 1)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", page
- 1, pageLinkText, prevText
);
if (pagesCount
<= showItemsCount
)
for (int i
= 1; i
<= pagesCount
; i
++)
if (i
!= page
)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", i, pageLinkText, i
);
else
sb
.AppendFormat("<{1}>{0}</{1}>", i, itemTag
);
else
{
for (int i
= 1; i
<= pagesCount
; i
+= showItemsCount
)
{
int end
= 0;
if (pagesCount
< showItemsCount
+ i
)
end
= pagesCount
;
else
end
= i
+ showItemsCount
- 1;
if (page
>= i
&& page
<= end
)
{
if (page
> showItemsCount
)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", i
- 1, pageLinkText, moreText
);
for (int j
= i
; j
<= end
; j
++)
{
if (j
!= page
)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", j, pageLinkText, j
);
else
sb
.AppendFormat("<{1}>{0}</{1}>", j, itemTag
);
}
if (page
<= pagesCount
- showItemsCount
+ 1)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", end
+ 1, pageLinkText, moreText
);
break;
}
}
}
if (page
< pagesCount
)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", page
+ 1, pageLinkText, nextText
);
if (IsFirstLast
&& page
< pagesCount
)
sb
.AppendFormat("<{0}><a href="{1}{4}{3}{2}">{5}</a></{0}>", itemTag, rootLink, anchorText
!= null ? "#" + anchorText
: "", pagesCount, pageLinkText, lastText
);
return sb
.ToString();
}
}
отмечу, что в приведённом выше коде генерятся только непосредственно элементы навигации, которые вставляются в контейнер (контейнер собственно нужен для определения внешнего вида пейджинга).
Задумал давно и вот всё-таки решил купить хостинг для размещения своих небольших проектов.
Долго думал у кого хостинг приобрести и главное, чтобы было всё и дёшево ибо особо тратиться не хотелось.
Как оказалось, и это вполне очевидно, предложения по услугам asp.net-хостинга можно найти тут, там и поиск удобный весьма. Вообщем выбор пал на arvixe.com по следующим причинам:
- хорошая оценка пользователей, плохого ничего не нашёл
- unlimited почти всего за достаточно небольшую сумму
- присутствие в галерее microsoft (для кого-то может и неважно)
- как выяснилось позже очень терпеливый персонал в техподдержке (в беде не бросают)
Зарегистрировался, подтвердил аккаунт в службе поддержки и оплатил. Тут же пришло письмо с данными необходимыми для доступа в панель управления, в которой опять же всё просто и понятно.
Развернул пару сайтов, пока всё очень даже неплохо: полёт нормальный.
Не так давно, неделю или две назад столкнулся с такой ошибкой на одном из проектов на странице авторизации. После небольшого анализа и просмотра запросов в Firebug’е выяснилось, что запрашиваемые WebResource.axd и ScriptResource.axd так и не подключаются к странице, а GET-запрос перенаправляется на страницу входа пока пользователь не авторизован, в Firebug’е присутствовали запросы вида:
- ?ReturnUrl=WebResource.axd и т.д.
- ?ReturnUrl=ScriptResource.axd и т.д.
Вследствие чего и возникала сабжевая ошибка. Но это полбеды.
Через location в web.config’е я добавил соответствующие правила для ресурсов, однако, доступ к ним все равно был запрещён.
Далее, я заблокировал только нужные страницы, а всё остальное сделал доступным для всех – тоже не сработало.
Наконец, решение было таки найдено: админ по ошибке выключил анонимную авторизацию в настройках сайта вследствие чего и наблюдалась данная проблема.