Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
  • Днепропетровский провайдер "Трайфл" хочет сделать платной зону dp.ua

    НПП "Трайфл" поддерживал зону dp.ua в течении 10 лет бесплатно. В течении этих 10 лет каждый мог зарегистрировать домен dp.ua и все были довольны. Осенью 2006 Трайфл решил упорядочить регистраторов доменов и каждый желающий регистрировать домены в течении нескольких месяцев должен был заключить договор с Трайфлом (обратите внимание, со сроком на 1 год). Все кто хотел заключил этот договор. Тут неожиданно 10 января Трайфл делает заявление, что теперь есть еще приложение к договору, по которому каждый из регистраторов должен вносить определенную сумму за право быть регистратором и определенную сумму за домен:

    С 1 февраля 2007 года в зоне DP.UA вводится оплата за делегирование и поддержку доменных имен. Направляем Вам приложение к текущему договору (см. вложение или http://nic.dp.ua/dogovor-2006-a2.rtf).

    Мотивируя это прежде всего тем, что это мелочи и можете и заплатить (а также как метод пресечь массовую регистрацию доменов). Мол "Трайфл" просто вынужден ввести эту сумму для поддержания зоны и вообще, как Вы могли подумать что хотим денег заработать, мы же для всеобщего блага. Некоторые провайдеры (в частности "УкрХостинг" и "СвитОнлайн") уже заявили, что в случае надобности они могут взять на себя делегирование зоны бесплатно. Но Трайфл, который так печётся прежде всего о "всеобщем благе", почему-то не выразил энтузиазма передать зону и избавиться от этой непосильной ноши, которую он вынужден сейчас нести.

    Баталии можно посмотреть (а также поучаствовать) можно на городском форуме gorod.dp.ua

  • Особенности использования яваскриптов для «командных» кнопок в GridView

    Иногда возникает задача, когда на какую-либо «командную» кнопку (т.е. кнопку, имющую значение CommandName “Edit”, “Delete” и т.д.) в строке GridView необходимо поцепить JavaScript. Самая распространенная из этих ситуаций – это поцепить яваскрипт на кнопку, которая выполняет команду Delete. Во избежание ошибочного удаления записи из хранилища данных было бы неплохо спросить пользователя что-то вроде «Вы уверены, что хотите удалить эту строку?» и предоставить возможность выбора (т.е. вызвать клиентский window.confirm).

    GridView предоставляет несколько возможностей создания кнопки с CommandName=”Delete”:

    1.       Указать в свойствах грида AutoGenerateDeleteButton="true". В этом случае всегда будет генерироваться LinkButton с CommandName=”Delete”.

    2.       Создать свою кнопку (это может быть как LinkButton, так и просто Button или ImageButton) и прописать  ей CommandName=”Delete”.

    3.       Использовать CommandField. У CommandField есть  свойство ButtonType, что также позволяет указать тип кнопки (LinkButton, ImageButton или Button)

    Я всегда использовал LinkButton и для того, чтобы поцепить на него яваскрипт добавлял следующий код в RowDataBound:

    protected void grid1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        if (e.Row.RowType == DataControlRowType.DataRow &&

        (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate))

         {

            if (e.Row.Cells[gridColumn].Controls[0] is LinkButton)

            {

     ((LinkButton)e.Row.Cells[gridColumn].Controls[0]).Attributes.Add("onclick", "return confirm('are you sure?')");

            }

          }

    }

    И все работало J

    Тут мне пришлось использовать ImageButton (а точнее CommandField, с ButtonType=”Image”). Попытка использовать аналогичный код не увенчалась успехом – при ответе «НЕТ» ничего  не происходит (а ничего и не должно происходить), а вот при ответе «ДА» происходит постбек без удаления записи. Это сначала ввело меня в небольшое замешательство, но исследование клиентского кода все поставило на свои места J Грид генерирует следующие варианты кода :

    для LinkButton :

    <a onclick="return confirm('are you sure?');" href="javascript :__doPostBack('ctl00$ContentPlaceHolder1$grid1','Delete$1')">Delete</a>

    для ImageButton :

    <input type="image" src="…" alt="Delete" onclick="return confirm('are you sure?');javascript :__doPostBack('ctl00$ContentPlaceHolder1$grid1','Delete$1')" style="border-width:0px;" />

    Отсюда видим, что GridView генерирует __doPostBack для «a» на href, а для «input» на onclick, т.е., цепляя какой-либо скрипт на onclick в RowDataBound Grid «закроет» этот яваскрит (чтобы не было открытых блоков вроде if как в данном случае) и только потом добавит к нему __doPostBack. Нажав на «ДА» window.confirm сразу вызывает постбек, не передав параметры в страницу (т.е. до вызова __doPostBack дело не доходит).

    Решается это очень просто – использованием следующего кода:

    ((ImageButton)e.Row.Cells[gridColumn].Controls[0]).Attributes.Add("onclick", "if(!confirm('are you sure?')) return false;");

    Т.е. в случае с «ДА» скрипт продолжит свое выполнение.

    Надіслане 07-12-2006 01:20 від Oleg Shastitko | 0 коментарів
    Зареєстрований як , ,
  • День разработчика - впечатления

    Сегодня день разработчика прошел в Днепропетровске. Докладчиками были Сергей Байдачный и Дмитрий Маленко. Мои впечатления – в целом мне понравилось, но все-же хотел бы немного покомментировать и покритиковать J

    Прежде всего – на мой взгляд, слишком много времени отводится на то, чтобы рассказать про UX (User Experience). Это конечно вещь нужная, но мне кажется, что именно здесь, на дне разработчика, где сидят одни программисты – это можно сократить – программист знает, а если не знает – то должен чувствовать это J Если говорить лично про меня, то когда как Сергей рассказывал про SQL Injection, так и когда Дмитрий рассказывал сначала про лифт, а про нож и открывашку – я уже с нетерпением ждал главного – т.е. касательно предметной области. Минут 10-20 многовато про это.

    Второе – думаю, в доклад про AJAX не мешало бы внести в самое начало немного (ну пару слов) про XMLHttpRequest – так, для общей картины понимания принципов работы AJAX. Также я бы советовал внести пару слов о ICallbackEventHandler – как промежуточное звено между библиотекой ATLAS и чистым AJAX. Ну и перевести с ATLAS на MS AJAX последнюю версию (я уже пообещал Дмитрию помочь с этим J )

     

    А так больше всего понравилось про XAML (и хотелось бы более детальнее послушать J ).

  • MS AJAX 1.0 Beta 2

    Хоть я и запоздал на один день, но все же...

    Заходим http://ajax.asp.net/ и качаем новую версию.

    Надіслане 07-11-2006 09:16 від Oleg Shastitko | 0 коментарів
    Зареєстрований як ,
  • Вызов клиентских скриптов до и после обновления UpdatePanel

    Вопрос «как вызвать клиентский скрипт до обновления или же после обновления UpdatePanel” я не раз встречал как на форумах, также мне его задавали друзья и знакомые.

    По сути задача довольно тривиальна – допустим, после обновления UpdatePanel её (updatePanel) нужно спрятать. В общем, причин почему иногда необходимо вызвать клиентскую функцию (подобно тому, как вызывается clientCallback в “чистом» AJAX) может быть множество. Когда передо мной стал подобный вопрос – оказалось, что вопрос решается штатными средствами, достаточно только внимательно почитать документацию J Итак, открываем документацию по MS AJAX (http://ajax.asp.net/docs) и заходим в раздел Client Script, а точнее нас интересует PageRequestManager. Получив текущий instance, мы можем поцепить обработчики для событий beginRequest и endRequest.

    Итого мы имеет:

     

        <script language="javascript" type="text/javascript">

                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 

                Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 

            function EndRequestHandler(sender, args)

            {

                alert('end request');

            }

            function BeginRequestHandler(sender, args)

            {

                alert('begin request');

            }

        </script>

     

    Функции BeginRequestHandler и EndRequestHandler вызываются соответственно в начале и в конце запроса. Но есть одно «НО»: если на странице несколько UpdatePanel, нам необходимо знать, какая из UpdatePanel обновлялась. Это такдже можно решить стандартными средствами – параметр args хранит объект response, из которого и можно «выдрать» какая из UpdatePanel обновилась.

     

    Следующий код:

     

    <body>

     

        <form id="form1" runat="server">

        <asp:ScriptManager runat="server" ID="sm" EnablePartialRendering="true">

        </asp:ScriptManager>

        <script language="javascript" type="text/javascript">

              Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); 

            function EndRequestHandler(sender, args)

            {

                var s = args.get_response().get_responseData().split('|');

                alert('Обновлена панель : ' + s[2]);

            }

        </script>

        <div>

            <asp:UpdatePanel RenderMode="Block" runat="server" UpdateMode="Conditional" ID="up1">

                <ContentTemplate>

                    <asp:Label runat="server" ID="lbl"></asp:Label>

                </ContentTemplate>

                <Triggers>

                    <asp:AsyncPostBackTrigger ControlID="BTN" EventName="Click" />

                </Triggers>

            </asp:UpdatePanel>       

            <asp:Button runat="server" ID="btn" Text="BTN" OnClick="btn_Click" />

            <br />

            <asp:UpdatePanel RenderMode="Block" runat="server" UpdateMode="Conditional" ID="up2">

                <ContentTemplate>

                    <asp:Label runat="server" ID="lbl2"></asp:Label>

                </ContentTemplate>

                <Triggers>

                    <asp:AsyncPostBackTrigger ControlID="BTN2" EventName="Click" />

                </Triggers>

            </asp:UpdatePanel>       

            <asp:Button runat="server" ID="btn2" Text="BTN2" OnClick="btn2_Click" />

        </div>

        </form>

    </body>

     

    При нажатии на кнопку BTN по окончанию запроса будет выведено «Обновлена панель : up1», по нажатию на BTN2 : «Обновлена панель : up2»

     

     

    PS. Благодарность Александру Попову (“mogadanez”,  http://blogs.gotdotnet.ru/personal/poigraem/ ) за помощь в данном вопросе.

     

    Олег Шаститко

    Надіслане 03-11-2006 04:32 від Oleg Shastitko | 0 коментарів
    Зареєстрований як ,
  • Использование AJAX в ASP.NET

    <FONT face="Times New Roman"><SPAN style="FONT-SIZE:16pt;"></SPAN></FONT>История развития web-приложений

     

    Рассматривая ту или иную новую технологию прежде всего необходимо разобраться для чего эта самая технология необходима и что именно она позволяет (или облегчает) делать, что не позволяют делать другие технологии. Чтобы более наглядно понять, какие предпосылки были к появлению AJAX, можно рассмотреть процесс эволюционного развития web-сайтов.

     

    На самой заре развития интернет сайты представляли собой набор простых статических страниц – пользователь запрашивал ресурс у сервера и сервер возвращал статическую страницу. Эта страница представляла собой простой HTML текст и хранилась как текстовый файл на сервере. Данная страница поставлялась пользователю as is и, кроме того, не имела никаких клиентских скриптов.

     

    CGI

     

    Первая попытка сделать страницы более динамичными был Common Gateway Interface (CGI). CGI позволял разработчику создавать исполняемые программы, которые генерировали страницу, что позволяло принимать параметры от пользователя. С учетом этих параметров можно было генерировать уникальную страницу. По большому счету, данный подход используется и сейчас в том же ASP.NET, PHP и т.д.

     

    JavaScript

     

    Генерация страниц на серверной стороне это конечно хорошо, но это вынуждало при каждом, даже самом незначительном действии пользователя, делать запрос к серверу с перегрузкой всей страницы. Чтобы не перегружать всю страницу в случаях, когда участие сервера абсолютно не нужно, стали использоваться клиентские скрипты.

     

    Апплеты и Flash

     

    В случае, если запрос к серверу все же необходим и одними клиентскими скриптами не обойтись – разработчики в web-страницах стали использовать т.н. апплеты а также flash.

    Апплеты впервые были использованы в 1995 году, когда Sun представила миру на всеобщее обозрение свою новую платформу с новым языком – JAVA.  По сути апплеты представляли собой программы, написанные на JAVA и которые могли запускаться в броузере как отдельные приложения. Для того, чтобы эта программа, написанная на неведомом для броузера языке JAVA, могла быть запущена внутри броузера, необходимо было установить JVM (Java Virtual Machine) – среду для выполнения программ JAVA. И хотя данный подход звучит очень заманчиво – он имел множество недостатков, прежде всего это проблемы безопасности (не каждый пользователь, путешествуя по интернет, разрешит запускать на своем компьютере программы непонятного происхождения) и необходимость громозкой VM. Несмотря на то, что помимо общения с сервером апплеты и флеш также позволяли реализовать возможности, недоступные JavaScript (скажем, более высокие требования к графике) – те сложности не дали апплетам прижиться настолько, чтобы окончательно решить проблемы с запросами к серверу.

     

    DHTML

     

    Dynamic HTML объединил в себе HTML, каскадные таблицы стилей (CSS) и JavaScript. Также ко всему этому набору добавился DOM – объектная модель броузера. Вся эта смесь позволяла (и позволяет) успешно создавать очень красивые, удобные и функциональные страницы «на лету». Но опять же, в случае, если нужно выполнить запрос к серверу – приходится перегружать весь документ.

     

    AJAX

     

    Решение этой проблемы пришло с появлением новой технологии, которая в 2004 году была названа AJAX (Asynchronous JavaScript + XML). Данная технология построена на принципе выполнения запроса к серверу с использованием JavaScript и получению результата опять же, с помощью JavaScript, что позволяет избежать перегрузки страницы и следовательно имеет несколько неоспоримых преимуществ:

    1. На сервер отправляются не все элементы страницы (точнее не их значения), а только те минимальные данные, которые необходимы для выполнения того или иного запроса и в ответ принимается не вся страница, а только необходимые данные, что позволяет уменьшить трафик в десятки (а иногда и в сотни) раз.
    2. Не происходит перегрузка страницы в броузере и у пользователя создается впечатление, что все происходит на его компьютере.

    Об этой технологии и пойдет дальше речь.

     

    Объектная модель броузера.

     

    Если вы меня спросите на чем основан принцип работы технологии AJAX, то я вам наверное отвечу : «благодаря объектной модели броузера». Что же это за такая объектная модель броузера (DOM)?

    Document Object Model (DOM) – это спецификация, стандартизированная W3C комитетом, которая является кроссплатформенной и описывает вызовы и описания, касающиеся действиям с самим документом, его структурой, HTML, XML и стилями. Как следует из названия, основой спецификации DOM являются объекты.

     

    Объект XMLHttpRequest

     

    Этот объект появился впервые в Internet Explorer 5.0 и был реализован как ActiveX компонент. Важно заметить, что этот объект не является стандартом W3C, хотя многое из его функциональности описано в спецификации «The DOM Level 3 Load and Save Specification». По этой причине его поведение может немного отличаться в различных броузерах. Но во всех броузерах он выполняет одну и ту же функциональность – он умеет посылать запросы к серверу и получать от него ответы. Как уже говорилось выше, данный объект не стандартизирован и создание его instance может отличаться в различных версиях, поэтому для «надежного» его создания лучше использовать код, который объединяет в себе создание instance в нескольких броузерах подобно коду ниже:

     

    var xmlHttp;

     

    function createXMLHttpRequest()

    {

    if (window.ActiveXObject)

    {

    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

    }

    else if (window.XMLHttpRequest)

    {

    xmlHttp = new XMLHttpRequest();

    }

    }

     

     

    XMLHttpRequest имеет ряд «стандартных» (стандартных в кавычках т.к. как писалось выше, данный объект не стандартизирован для всех броузеров) свойств и методов, которые позволяют данному объекту посылать запрос, проверять состояние запроса и получать результат выполнения запроса от удаленного сервера. Эти свойства и методы мы рассмотрим в следующих двух таблицах.

     

    В таблице 1 представлены «стандартные» свойства XMLHttpRequest

    Метод

    Описание

    abort()

    Прерывает текущий запрос

    getAllResponseHeaders()

    Возвращает все заголовки Response в виде ключ/значение

    getResponseHeader(header)

     

    Возвращает значение определенного заголовка

    open(method, url, asynch, username, password)

    Устанавливает состояние запроса к серверу. Первый параметр указывает метод запроса – PUT, GET, POST, второй – url запроса, третий (необязательный) – тип запроса (синхронный или асинхронный), четвертый и пятый (также необязательные) – для защищенных страниц

    send(content)

    Посылает запрос серверу

    setRequestHeader(header, value)

    Устанавливает значение определенного заголовка. Перед вызовом этого метода необходимо вызвать метод open

     

    Также XMLHttpRequest содержит ряд свойств, которые представлены ниже:

     

    Свойство

    Описание

    onreadystatechange

    Обработчик события, которое возникает при каждой смене состояния запроса

    readyState

    Состояние запроса. Доступны следующие значения: 0 – запрос неинициализирован, 1 – загрузка, 2 – загрузка окончена, 3 – interactive, 4 - complete

    responseText

    Ответ от сервера в виде строки

    responseXML

    Ответ от сервера в XML. Этот объект может быть обработан и проверен как DOM

    status

    Код статуса HTML.(например 200 – OK)

    statusText

    Название кода статуса HTML

     

    Бегло проглянув эти методы, несложно понять, какие методы достаточно вызвать, чтобы с помощью JavaScript получить какие-либо с сервера.

    Прежде всего напишем серверную часть, которая будет возвращать простую строку. Для этого (чтобы не было «посторонних» данных вроде тегов открытия закрытия html) наиболее рационально будет создать hanlder. Открываем web-проект в Visual Studio 2005 и создаем файл типа Handler. Содержимое будет примерно следующим:

     

    <%@ WebHandler Language="C#" Class="MyHandler" %>

     

    using System;

    using System.Web;

     

    public class MyHandler: IHttpHandler {

       

        public void ProcessRequest (HttpContext context) {

            context.Response.ContentType = "text/plain";

            context.Response.Write("Hello World");

        }

     

        public bool IsReusable {

            get {

                return false;

            }

        }

     

    }

     

    Т.е. при запросе данной страницы этот hanlder возвращает text/plain документ с единственной строчкой “Hello World”. Нас такой handler устраивает как нельзя лучше.

    Теперь создадим обычную HTML – страницу, которая будет и выполнять запрос, используя XMLHttpRequest.

     

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head>

        <title>Simple XMLHttpRequest page</title>

        <script type="text/javascript">

            var xmlHttp;

            function createXMLHttpRequest()

            {

                if (window.ActiveXObject)

                {

                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

                }

                else if (window.XMLHttpRequest)

                {

                    xmlHttp = new XMLHttpRequest();

                }

            }