Custom Events in ASP.NET

8 отговора 273 прегледа
#1

Custom Events in ASP.NET

Здравейте, проблемът ми е следният имам страница, от чийто JavaScript искам да извикам функция на сървъра. Начинът, по който се опитвам да направя това е да дефинирам събитие и да го добавя към Page.Events, а в последствие в кода на скрипта да го извикам с __postback(....). Но имам проблем с дефинирането на събитие, някой може ли да ми обясни точно схемата, по която трябва да дефинирам това събитие? .

Отговор
в отговор на Memo #2

Re: Custom Events in ASP.NET

В такива случаи просто предаваш допалнителен аргумент. Или слагаш скрито поле във формуляра, или го добавяш ръчно към querystring-a. При зареждане на страницата проверяваш има ли такъв аргумент и ако има си викаш каквото искаш.

Отговор
в отговор на s_dimi #3

Re: Custom Events in ASP.NET

Работата е, че функционалността, от която имам нужда е server side, затова се нуждая от post back. Опитах да поствам скрип, когато дадено условие е изпълнено, този скрипт, рефрешваше страницата примерно на 10 сек, само че когато се опитва да рефрешне страницата ми излиза един много неприятен диалогов прозорезц, който проваля цялата работа, докато когато се прави post back с __postback, който обработва даден евент няма такъв проблем.

Отговор
в отговор на Memo #4

Re: Custom Events in ASP.NET

Има два момента при обработването на постбек: 1. как да обработим данните? и 2. как да обработим евента?

Контрол който трябва да обработва данни който са постбекват трябва да имплементира интерфейса: IPostBackDataHandler. А контрол който трябва да обработва евенти трябва да имплементира интерфейса: IPostBackEventHandler.

IPostBackData интерфейса позволява на контрола да достъпва данни който идват с евента. Интерфейса задължава всички които го имплементират с два метода:

LoadPostData, който се вика за да се постбекне данни към контрола
RaisePostDataChangedEvent, който се вика след LoadPostData за да може контрола да извика евенти които да информират за промяната на състоянието му.

Примерно:

public void RaisePostBackEvent(string eventArgument)
{
OnMyStupidEvent(new EventArgs());
}

public void OnMyStupidEvent(EventArgs ea)
{
DoSomethingHere(this, ea);
}


По принцип, като пишеш контрол който прави постбек, трябва да добавиш следния код в Render метода му:

protected override void Render(HtmlTextWriter output) {
output.Write("<a id=\"" + this.ID + "\" href=\"javascript:" + Page.GetPostBackEventReference(this) +"\">");
output.Write(" " + this.ID + "</a>");
}

GetPostBackEventReference изпюва клиентски скрипт който прави постбек и дава референсе към контрола който прави постбека. Кода който се генерира прилича на нещо такова:

<form name="ctrl" method="POST" action="button.aspx" id="ctrl">
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" value="blablablanotreadableblabla" />
<a id ="link" href="javascript:__doPostBack('link','')">кликай смело</a>
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.ctrl
theform.__EVENTTARGET.value = eventTarget
theform.__EVENTARGUMENT.value = eventArgument
theform.submit()
}
// -->
</script>

Скритите полета показват кой сървър контрол да направи постбек и аргумент. Клиентския скрипт дава стойности на скритите полета и събмитва формата към сървъра.

За да "уловиш" този постбек евент трябва да имплементираш IPostBackEventHandler интерфейс. Този интерфейс те задължава да имплементираш public void RaisePostBackEvent(string eventArgument) method в който ще прихващаш "кликове".

Примерно:

[DefaultEvent("MyStupidEvent")]
public class MyBuggyClass : System.Web.UI.WebControls.WebControl, IPostBackEventHandler, IPostBackDataHandler


и после си декларираш евента съвсем естествено:

public event EventHandler MyStupidEvent;


Няма да пиша кода който ти прави __postback-а щото ти явно си го имаш написан. Но това което трябва да направиш е да имплементираш 2-та метода на IPostBackDataHandler. Първия ти се вика при всеки постбек и в него проверяваш дали това ти е точно твоя контрол, ако е така връщаш труе и втория се извиква, ако не връщаш фалсе и втория не се вика.

bool IPostBackDataHandler.LoadPostData(string postDataKey,
NameValueCollection postCollection)
{
if(postDataKey==this.ID)
{
return true;
}
else
{
return false;
}
}

void IPostBackDataHandler.RaisePostDataChangedEvent()
{
MyStupidEvent(this, EventArgs.Empty);
}

В code behind си дефинираш имплементацията на евента и си готов. Успех. :)


XM TurboCT .. where comfort meets power
Отговор
в отговор на шeф нa Coди Дeвня #5

Re: Custom Events in ASP.NET

Много ти благодаря за изчерпателното мнение!!!
А знаеш ли обаче, как се добавя евент към обекта Page, нещо общо с Page.Events свойството?

Отговор
в отговор на Memo #6

Re: Custom Events in ASP.NET

Ya po-dobe procheti pak ASP.NET knijkite i come back :)

Постинга се излъчва със съдействието на Завод за лоени войничета "СИЛА - Цялапица"
Отговор
в отговор на Memo #7

Re: Custom Events in ASP.NET

Това наистина беше малко тъпо, но както и да е...

Отговор
в отговор на Memo #8

Re: Custom Events in ASP.NET

не се връзвай на комплексарите по форумите, тези форуми предлагат нови неограничени хоризонти пред умствено ограничените субекти да избиват комплексите си, така че споко и не се коси

Та на въпроса: явно нещо не ти разбрах въпроса и се впуснах в обяснения, но няма лошо, важното е да бистрим .NET-a, нали затова сме се събрали тука

А къв е проблема да го направиш по най-простия начин:

Page.Events.AddHandler(MyCustomEvent, value);

Доколкото си спомням Page.Events е read-only и има само get, което значи че не можеш да го set-ваш с нова колекция, но не значи че не можеш да му викаш методи въпреки че те променят колекцията. В нас нямам .NET и не мога да го пробвам ама ти го пробвай ако не стане ще го мъдрим още


XM TurboCT .. where comfort meets power
Отговор