powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Параметр в GetPostBackEventReference заранее неизвестен
2 сообщений из 2, страница 1 из 1
Параметр в GetPostBackEventReference заранее неизвестен
    #33848401
PetrovichForever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу CustomControl, у которого внутри есть <input type="text" />.
В коде есть GetPostBackEventReference() который добавляет к <input type="text" />, серверную обработку события onchange.
Но при этом в GetPostBackEventReference мы должны конкретно указать параметр, который будет передан в постбэке, и пойман нами в RaisePostBackEvent.
В нашем же случае, нужно чтобы в постбэке в качестве параметра был передан текст, который введет юзер. Как это сделать?

Если говорить о коде, то имеем что то вроде:


        protected override void RenderContents(HtmlTextWriter output)
        {
            ClientScriptManager cs = Page.ClientScript;

            output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            output.AddAttribute(HtmlTextWriterAttribute.Onchange, cs.GetPostBackEventReference(this, "AAA")); // <-- вот оно где!

            output.RenderBeginTag(HtmlTextWriterTag.Input);
            output.RenderEndTag();
        }

Если использовать такой код, то в



        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
        {
          
    }
в параметре eventArgument передастся ААА.
Но нам нужно получить не ААА, а то что ввел пользователь. Как?
...
Рейтинг: 0 / 0
Параметр в GetPostBackEventReference заранее неизвестен
    #33848951
PetrovichForever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, PetrovichForever, Вы писали:

PF>Пишу CustomControl, у которого внутри есть <input type="text" />.
PF>В коде есть GetPostBackEventReference() который добавляет к <input type="text" />, серверную обработку события onchange.
PF>Но при этом в GetPostBackEventReference мы должны конкретно указать параметр, который будет передан в постбэке, и пойман нами в RaisePostBackEvent.
PF>В нашем же случае, нужно чтобы в постбэке в качестве параметра был передан текст, который введет юзер. Как это сделать?

PF>Если говорить о коде, то имеем что то вроде:

PF>
PF>        protected override void RenderContents(HtmlTextWriter output)
PF>        {
PF>            ClientScriptManager cs = Page.ClientScript;

PF>            output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
PF>            output.AddAttribute(HtmlTextWriterAttribute.Onchange, cs.GetPostBackEventReference(this, "AAA")); // <-- вот оно где!

PF>            output.RenderBeginTag(HtmlTextWriterTag.Input);
PF>            output.RenderEndTag();
PF>        }
PF>

PF>Если использовать такой код, то в


PF>
PF>        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
PF>        {
          
PF>    }
PF>
PF>в параметре eventArgument передастся ААА.
PF>Но нам нужно получить не ААА, а то что ввел пользователь. Как?

Сам себе же и отвечаю:
для того, чтобы контрол мог передавать данные, нужно реализовать IPostBackDataHandler,
который включает в себя два метода:LoadPostData и RaisePostDataChangedEvent,
которые могут быть например такими (в моем случая я передаю дату в виде dd.mm.yyyy):


        bool IPostBackDataHandler.LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            DateTime presentValue = Date;
            DateTime postedValue = Str2Date(postCollection[postDataKey]);

            if (!presentValue.Equals(postedValue))
            {
                Date = postedValue;
                return true;
            }
            return false;
        }

        void IPostBackDataHandler.RaisePostDataChangedEvent()
        {
            MyEventArgs e = new MyEventArgs(Date);
            OnDateChanged(e);
        }
в методе LoadPostData мы достаем из коллекции запостеных значений то, что принадлежит нам, и сравниваем с тем значением, что у нас уже имеется.
В случае если эти значения разные, значит перед постом формы, юзер изменил что то в текстбоксе, и необходимо: а) сохранить в контроле это новое значение, и б) пометить необходимость выполнить RaisePostDataChangedEvent, вернув true.
В RaisePostDataChangedEvent происходит вызов и дальше по логике контрола.

Теперь рендринг контрола:


        protected override void Render(HtmlTextWriter writer)
        {
            RenderBeginTag(writer);
            RenderContents(writer);
            RenderEndTag(writer);
        }
Здесь нам интересен только вызов RenderContents(writer); в котором рендрится функционал нашего контрола.

Дальше непосредственно функционал:

protected override void RenderContents(HtmlTextWriter output)
{
   output.RenderBeginTag(HtmlTextWriterTag.Tbody);
   output.RenderBeginTag(HtmlTextWriterTag.Tr);
   output.RenderBeginTag(HtmlTextWriterTag.Td);

   output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
   output.AddAttribute(HtmlTextWriterAttribute.Value, Date2Str(Date));  // Показываем в контроле текущую дату
   output.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);    // А вот это обязательно!!!
   output.AddAttribute(HtmlTextWriterAttribute.Onchange, Page.ClientScript.GetPostBackEventReference(this, "")); //Эта строчка 
              // выставляет влаг в Page, который впоследствии (при рендринге страницы) укажет на необходимость добавить __doPostback в страницу.
              // Кроме того эта строка добавляет JavaScript-вызов постбэка, так что она тоже обязательна :)

   output.RenderBeginTag(HtmlTextWriterTag.Input); // Собственно, наш основной input
   output.RenderEndTag();
   
   output.RenderEndTag();
   output.RenderEndTag();
   output.RenderEndTag();
}

Вот и все ... :)

PS Кстати, пример в msdn'не не правильный. Может я ошибаюсь, но попробуйте заставить работать этот код, разьяснения тут
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Параметр в GetPostBackEventReference заранее неизвестен
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]