Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

ASPNET и HyperLink   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2007-12-30 03:51) [0]

Второй день мучаюсь, пытаясь реализовать события для HyperLink control
Хочу сделать следующее, при нажатие на гиперссылку - послать событие на сервер, сделать запрос к базе, а потом перейти по гиперссылке. Но у HyperLink или у HyperLinkField нет события OnClick или еще лучше BeforeNavigate. Используются в GridView.

Пока научился встраивать в GridView почти любые компоненты, через TemplateField, а вот с событиями плохо. Кроме них можно использовать и ButtonField и CommandField со стилями Link/Button у этих генерируется клиетский обработчик OnClick, но я пока не могу заставить его работать. Обработчик вызывается так __DoPostBack("GridView","$#") и в форме сгенерирован такой обработся на JScript - но как в него передать URL и заставить работать пока не понятно, но лучше бы обработчик OnClick или BeforeNavigate для гиперссылки.

Какие есть советы, чтобы сделать задуманное.
Среда программирования VWD-2008.


 
Германн ©   (2007-12-30 04:16) [1]


> Anatoly Podgoretsky ©   (30.12.07 03:51)

<offtop>
Опять бессонница?
</offtop>


 
Anatoly Podgoretsky ©   (2007-12-30 08:07) [2]

> Германн  (30.12.2007 04:16:01)  [1]

Она самая, так и не уснул сегодня, буду тренировать организм, что бы работал непрерывно 24 часа.


 
Ketmar_   (2007-12-30 09:58) [3]

почитал. испугался. неее, я лучше про «водку или вино» читать буду.


 
Anatoly Podgoretsky ©   (2007-12-30 10:03) [4]

Ну с водкой можно и три дня работать без сна.


 
Ketmar_   (2007-12-30 10:06) [5]

однако пробовал. грустное зрелище…


 
Александр Иванов ©   (2007-12-30 12:06) [6]

RowCommand?


 
kaif ©   (2007-12-30 12:24) [7]

У Дино Эспозито в книге ASP.NET "Углубленное изучение" (Programming Microsoft® ASP.NET 2.0 Applications: Advanced Topics ) в главе 13 "Создание специализированных элементов управления ASP.NET как раз показывается пример решения именно Вашей задачи "Усовершенствование элемента управления HyperLink". Стр.449. Есть и исходный код примеров, который можно скачать здесь:
http://www.microsoft.com/mspress/companion/0-7356-2177-2/
там есть download code samples.

О регистрации клинтских сценариев при помощи объекта класса ClientScriptManager (экземпляр объекта этого класса уже имеется в свойстве Page.ClientScript) можно прочитать в той же книге в главе 6.

Реализация же событий типа OnClick, вызывающих возврат формы, осуществляется так: нужно при объявлении своего компонента унаследовать интерфейс IPostBackEventHandler и реализовать его метод RaisePostBackEvent.

public class MyControl: System.Web.UI.WebControls.WebControl,
IPostBackEventHandler

//достаточно реализовать этот метод интерфейса IPostBackEventHandler
   //и контрол будет обрабатывать событие с помощью механизма __doPostback()
   //со скрытыми полями

public virtual void RaisePostBackEvent(string eventArgument)
   {
     //здесь я перехватил и вывел в сообщения трассировщика информацию, которую можно использовать в этом обработчике для своих каких-то целей
     Page.Trace.Warn("RaisePostBackEvent: ID=" + this.ID + ", eventArgument=" + eventArgument);
   }  

//а при рендеринге самого элемента нужно назначить JavaScript атрибуту OnClick

   protected override void RenderContents(HtmlTextWriter writer)
   {

//.......
     string _PostBackEventReference;
       //вызвать метод GetPostBackEventReference - вот все, что нужно сделать
       //для того чтобы автоматически вставить все необходимые скрытые поля
       //и текст java-скрипта __doPostback() в форму.
       _PostBackEventReference = Page.ClientScript.GetPostBackEventReference(this, i.ToString(), true);

       _HyperLink.Attributes.Add("href", "javascript:" + _PostBackEventReference);

//........
}

Извиняюсь за сумбур. (Выдрал текст из своего другого компонента, который состоит из кучи HyperLink-ов).


 
Anatoly Podgoretsky ©   (2007-12-30 17:12) [8]

> kaif  (30.12.2007 12:24:07)  [7]

Сейчас есть два решения - первый использовать ButtonField, другой или отдельная форма или процедура и в ней обрабатывать вызов скрипта и параметров.
Вторая выглядит приятней, поскольку более универсальна.


 
b z   (2007-12-30 18:24) [9]

Если правильно понял задачу, то:
LinkButton + [6] + Response.Redirect или Server.Transfer


 
kaif ©   (2007-12-30 18:44) [10]

Собственно сначала нужно понять, что мы хотим сделать. При клике по гиперссылке, очевидно, мы должны вызвать некоторый один и тот же ресурс (страницу), который обратится к базе данных, а затем перенаправит запрос по url-у, указанному в гиперссылке. Есть два способа это сделать: редирект и форвардинг. При редиректе браузеру в ответ на данный запрос посылается новый адрес (url) для нового запроса, а при форвардинге сервер сам перенаправляет исходный запрос по нужному url. Но чтобы сделать редирект или форвардинг наш ресурс должен как-то суметь получить этот url. Либо параметром в строке запроса (метод get) либо в некотором поле в составе формы, отосланной на сервер (метод post).

 Необязательно, чтобы Ваша задача решалась оптимально через события типа OnClick в обработчиках той же страницы, что выводит сетку.

 Но для понимания того, что происходит при таких вызовах, я немного раскрою эту тему.
 В ASP.NET обычно форма посылается "самой себе". И только при таком подходе возможно говорить об "обработчиках событий" типа OnClick или OnChange или подобные им.
 Механизм их вызова таков. Имеется джава-скрипт функция __DoPostBack(), принудительно отсылающий форму на сервер. Эта функция единственная и она встраивается в страницу автоматически, если используется хотя бы один компонент, реализующий интерфейс IPostBackEventHandler. То, какой компонент ее вызвал, определяется первым параметром eventTarget, который в нее передается. Функция записывает в скрытое поле __EVENTTARGET уникальный идентификатор ID вызвавшего ее элемента и благодаря этому HTTP-обработчик страницы (на сервере) узнает, какой компонент вызвал это событие, после чего (на сервере) вызывает метод RaisePostBackEvent интерфейса  IPostBackEventHandler, который реализуется этим компонентом и уже этот метод вызывает то, что назначено в качестве обработчика событию OnClick компонента.

function __doPostBack(eventTarget, eventArgument) {
   if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
       theForm.__EVENTTARGET.value = eventTarget; //запоминаем имя компонента
       theForm.__EVENTARGUMENT.value = eventArgument;
       theForm.submit(); //вызываем искусственный сабмит формы
   }
}


А как же встраивается сам вызов в HTML-код? Ведь при вызове функции нужно гарантировать, что в качестве первого аргумента в нее будет передан действительный ID компонента, который (например, если этот компонент находится в строке сетки) формируется рантайм. Для этого при рендеринге компонента и используется метод:

Page.ClientScript.GetPostBackEventReference(this, i.ToString(), true);

Этот  метод возвращает правильный способ вызова, например "javascript:__doPostBack("GridView","$#")", который уже и встраивается разработчиком компонента в процессе рендеринга в HTML-тэг в виде атрибута OnClick или href или еще чего-нибудь, что в данном случае подходящее.

Я пока сам только изучаю ASP.NET, поэтому выражаюсь слишком длинно. Если что-то непонятно, Вы меня переспросите. Надеюсь, что некоторый свет на обратный вызов формы и его механизм я все же пролил. :)


 
Anatoly Podgoretsky ©   (2007-12-30 19:27) [11]

Я думаю более просто это сделать вызов ~/Redir.aspx?id=...
Тогда достаточно разработать (один раз) страницу редиректа и оно будет работать для HyperLink и HyperLinkField. id может формировать автоматически, из поля ID в базе, например в DataNavigateUrlFormatString - ~/Redir.aspx?id={0}


 
Anatoly Podgoretsky ©   (2007-12-30 19:43) [12]

> Anatoly Podgoretsky  (30.12.2007 19:27:11)  [11]

Приятное тоже есть, объем документации уменьшился на 14 уроков, общим объемом в 500 мб


 
kaif ©   (2007-12-30 20:34) [13]

2 Anatoly Podgoretsky ©   (30.12.07 19:27) [11]
 У меня опыта работы пока нет, но мне кажется, что для начала это нормальное решение. Параметр ID потом можно получить как Request.Params["ID"].

 Рекомендую еще посмотреть, что у Вас получается в результате в скрытом поле __VIEWSTATE. Если поддержка состояния для сетки в данном случае не нужна, рекомендую отключить поддержку состояния у сетки (свойство EnableViewState), чтобы не перегружать страницу лишними символами в этом поле.


 
Anatoly Podgoretsky ©   (2007-12-30 21:17) [14]

Я уже дошел до этой стадии, пока для отладки получаю через querystring.
После первой компиляции, время реендеринга страницы менее 150 мс.
Запрос в базу по 6 таблицам, это главная страница.
Сейчас попробую через Request.Params["ID"].


 
Anatoly Podgoretsky ©   (2007-12-30 21:46) [15]

Чего то сильно ругается на все формы Request.Params


 
Anatoly Podgoretsky ©   (2007-12-30 21:54) [16]

Вот так получилось ID = Request.Params.Item("ID")
Приятно было встретить знакомые конструкции в VB

try
finally
end


 
Anatoly Podgoretsky ©   (2007-12-31 00:58) [17]

> kaif  (30.12.2007 20:34:13)  [13]

У меня например сортировка по заголовкам, надо посмотреть влияет ли оно на это.
До сегодняшнего вечера был доволен редактором, а сегодня много пришлось переделелывать, теряет поля и иногда портит код, приходится ручками попровлять, а так удобнее Борландовского.


 
kaif ©   (2007-12-31 15:07) [18]

2 Anatoly Podgoretsky ©
 Кстати, пользуетесь ли Вы трассировщиком? Очень удобная вещь, если нужны отладочные выводы. Выводит всю информацию о событиях в браузере (ниже Вашей страницы). Включается простой установкой Trace="true" в директиве <%@ Page %>. В любом месте кода Вы можете расположить отладочные выводы и они будут там видны. Я прибегаю к выводу Page.Trace.Warn("строка"). Сообщения Warn выводятся в трассировщике красным цветом.


 
vrem_   (2007-12-31 15:19) [19]

kaif ©   (31.12.07 15:07) [18]
трассировщик и баста! :)


 
Anatoly Podgoretsky ©   (2007-12-31 21:35) [20]


> kaif ©   (31.12.07 15:07) [18]

Использую и трассировочный файл тоже, у него хороший профилировщик и можно выбирать события. Я же не зря качал гигабайты видео уроков.

Да redirect реализовал, все класно и просто. Немного помучился с передачай параметров, пока собразил как сделать. Мне надо было на страничку передавать два параметра redir.aspx?Id=...&DownloadFile=...


 
Anatoly Podgoretsky ©   (2007-12-31 21:39) [21]

Сейчас реализовывываю DAL и BLL пока еще не работает.


 
vrem_   (2007-12-31 21:39) [22]

Anatoly Podgoretsky, Вы мой герой! я вас всегда читаю и зачитываюсь!
подарите пустячок, удалите регистрацию vrem, а? Вы же всё можете!


 
Anatoly Podgoretsky ©   (2007-12-31 22:32) [23]

> vrem_  (31.12.2007 21:39:22)  [22]

Не могу, нет доступа


 
Anatoly Podgoretsky ©   (2008-01-01 21:21) [24]

Дошел до четвертой главы "Data Tutorial" всего 75, вот теперь удобно стало работать с GridView и DAL/BLL. Также как и со статическим датасет.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.041 c
6-1179844049
Tor
2007-05-22 18:27
2008.02.03
Ошибка EIdClosedSocket (Indy) при завершении соединения


2-1200160636
петрович07
2008-01-12 20:57
2008.02.03
imagelist


2-1199825695
Петька
2008-01-08 23:54
2008.02.03
Оценка алгоритмов


2-1199471551
vegarulez
2008-01-04 21:32
2008.02.03
про sql (access). Как селектом выбрать Limit 10 или first 10...


3-1190804341
Vazhik
2007-09-26 14:59
2008.02.03
Псевдоним БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский