Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Параметр в GetPostBackEventReference заранее неизвестен
|
|||
|---|---|---|---|
|
#18+
Пишу 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 передастся ААА. Но нам нужно получить не ААА, а то что ввел пользователь. Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 15:17 |
|
||
|
Параметр в GetPostBackEventReference заранее неизвестен
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, 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'не не правильный. Может я ошибаюсь, но попробуйте заставить работать этот код, разьяснения тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2006, 17:11 |
|
||
|
|

start [/forum/topic.php?fid=18&tid=1391789]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
134ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 454ms |

| 0 / 0 |
