Форум: "Прочее";
Текущий архив: 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