[ ajaalba @ 12.01.2008. 18:00 ] @
Imam jedan problem.

Nikad nisam radio sa ASP -om ili ASP.Net -om.

Eto to je moj glavni problem. Molim vas, kolege koje znaju ASP, da mi pomognete. U pocetku su stvari delovale sasvim osnovno i jednostavno...:

Imam web site nastao iz VS2005 koji ima klasu _Default, koja ima najobicniji dogadjaj:

protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!Page.IsPostBack)
{
TextBox1.Text = "String";
}

}
catch (Exception ex)
{

}
}

... Stvari su se iskomplikovale kada sam hteo da iz metode koju pozivam na nekom desetom mestu uradim promenu vrednosti gore pomenutog TextBox1...:

public void Update()
{
TextBox1.Text = "Novi string";
}

... i da mi se po izvrsenju ove metode TextBox1.Text automatski promeni.

Drage kolege kako ovo da ostvarim? Pomagajte.
[ Shadowed @ 12.01.2008. 19:05 ] @
Pa, zavisi gde je to "neko deseto mesto", ali ako se nalazi van te strane, onda je TextBox1 nedostupan. To mozes resiti tako sto tom Update() metodu prosledis textbox odande odakle pozivas (pod uslovom da pozivas sa strane na kojoj je taj TextBox1, inace moras od metoda do metoda da bi stigao do Update):
Code:

public void Update(TextBox tBox)
{
tBox.Text = "Novi string";
}
[ ajaalba @ 12.01.2008. 20:37 ] @
Sad vidim da sam se pogresno izrazio i izvinjavam se.

Dakle pri izvrsavanju Update() metode treba da se ponovi kod koji se izvrsava na Page_Load dogadjaju (moj problem je sto ne mogu da pronadjem nesto tipa RefreshPage() sto bi mi resilo sve probleme)

Dakle "Novi string" u metodi Update() nije novi string, vec podatak koji se cita iz baze, ali je u medjuvremenu promenjen na desetom mestu ...
[ aleksandarpopov @ 12.01.2008. 21:05 ] @
Ako sam te dobro razumeo onda mozes da izdvojis telo metoda Page_load u npr.
Code:

private void Instanciranje()
{
try
{
if (!Page.IsPostBack)
{
TextBox1.Text = "String";
}

}
catch (Exception ex)
{

}

}


i na page_load event pozoves taj metod, ako ti je ponovo potrebna ta vrednost mozes pozvati taj metod bilo kada... a ako ti je potrebno da cuvas vrednos nekih promenljivih tokom rada web aplikacije mozes da ih cuvas u promenljivama sesije ili viewstate ili kukijima (posto obicne promenljive "izgube" svoju vrednost tokom razlicitih zahteva za stranicama ako ne koristis promenljive sesije ili viewstate... bilo je nedavno ovde na forumu o tome, koristi pretragu.
[ ajaalba @ 12.01.2008. 21:49 ] @
@aleksandarpopov: hvala na pokusaju, ali cini mi se da me nisi dobro razumeo.

Vrednost je u bazi. Iz iste se cita preko metode klase koja postoji i nije relevantna (to je moja standardna klasa za dobavljanje podataka iz baze i koristim je za win aplikacije.). Vazno je samo da taj metod postoji i zvacemo ga Fetch().

Kada startujem stranicu, dakle invokujem dogadjaj Page_Load, pozivam Fetch() i ono sto mi se vrati iz baze upisem u TextBox1.

OK. Metoda Update() samo treba da refreshuje stranicu tako da mi se opet izvrsi ista stvar... dakle kada pozovem Update() ja u stvari zelim samo da osvezim prikaz. Sa strane web aplikacije nista se nije promenilo. Znaci kada uradim refresh u browseru
[bez ...if(!Page.IsPostBack)...] ja dobijem zeljeni rezultat.

Kako da dobijem zeljeni rezultat a da ne pritisnem refresh? jel ima neko resenje?
[ aleksandarpopov @ 12.01.2008. 22:31 ] @
Jbg.. ja te i dalje ne razumem :)
Ako hoces da ti se izvrsi nesto svaki put, ne samo ako je stranica prvi put zahtevana (tj. ako nije post back) NE moze u okviru ono ga if-a sa post back. Ne razumem bas sta ti je problem ...
[ ajaalba @ 12.01.2008. 23:20 ] @
OK. kako iz metode web klase mogu da refreshujem stranicu?
[ Predrag Glumac @ 13.01.2008. 00:31 ] @
Ne mozes, jer se osvezavanje poziva od strane klijenta, ne servera. Mozes da probas nesto kao Response.Redirect(uri). Bilo bi bolje da objasnis sta pokusavas da uradis, jer je pravljenje WinForms i ASP.Net aplikacija po konceptu maltene dijametralno suprotno.
[ ajaalba @ 13.01.2008. 01:32 ] @

pokusavam da uradim nesto ovog tipa:

Code:


public partial class _Default : System.Web.UI.Page, IObserver
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {             
                Struct s = new Struct();
                s.data = FetchSomeData();
                TextBox1.Text = s.data;
         }
         catch (Exception ex)
         {

         }
   }

   ///
   ///Promena se desila na bazi van ovog sistema. Ali zahvaljujuci IObserver interfejsu ova metoda ce se pozvati.
   ///
   public void Update()
   {
        //TODO: Ubaciti logiku kojom se osvezava ova stranica i time automatski notifikovati klijenta o promeni podatka. 
   }

}


Znaci idealno bi bilo kada bi moglo:

Code:

   public void Update()
   {
        Page.Refresh();
   }


Po predjasnjem postu kapiram da to nije bas tako moguce kako sam ja zamislio a sada vidim i zasto... ali kako?

Kad si rekao klijent-server na pamet mi pade javascript (u kome se moze izvrsiti refresh)... hm... ali kako to ubaciti da se poziva iz metode i to za ovu stranicu? (ovo poslednje je samo ideja koju mozda treba razraditi. Ja ipak ne znam nista o ASP-u, web servisima i svemu tome sto pocinje na w :( ).
[ Predrag Glumac @ 13.01.2008. 02:19 ] @
Pa malo ti je prevelik prvi zalogaj ASP.Neta To sto si zamislio (da se promene baze na serveru osvezavaju na klijentu) moguce je da preko da postavis metadata refresh na stranici i da se klijent automatski osvezava u nekom intervalu.
Ja ne znam kako bi se Observer pattern koristio nad ASP.Net aplikacijom, mozda preko AJAXa, ali pokusaj recima da objasnis sta pokusavas da uradis.
[ Shadowed @ 13.01.2008. 09:37 ] @
Pazi, tebi se taj Update() kao i svaki drugi metod pozivaju prilikom ucitavanja strane, osim u slucajevima da je to pozvano prilikom ucitavanaj neke druge ili je spojeno sa nekim drugim procesima. E sad, ako nije neki od ovih posebnih slucajeva, onda lepo to sto ti je u Page_Load stavi u treci metod koji ces pozivati bilo iz page_load, bilo iz Update().
Ako jeste neki od ovih posebnih slucajeva (znaci, dolazi do nekih promena nakon sto je stranica vec poslata klijentu), e onda jedino preko ajax-a, sto zaista jeste komplikovanija stvar ako se tek sreces sa asp.net-om.
[ Prokleta_Nedelja @ 13.01.2008. 11:18 ] @
Jedino sto mi pada na pamet je AJAX i jedan tajmer koji bi svakih 5 sekundi provjeravao promjene u bazi. Ili mozda mali js kod koji ce refresovati str.
[ ajaalba @ 13.01.2008. 12:08 ] @
Citat:

Ako jeste neki od ovih posebnih slucajeva (znaci, dolazi do nekih promena nakon sto je stranica vec poslata klijentu), e onda jedino preko ajax-a, sto zaista jeste komplikovanija stvar ako se tek sreces sa asp.net-om.

^
|
Ovo je slucaj.

Potpuno vas razumem ako vas mrzi detaljnija rasprava sa mnom na ovu temuna na bilo kom daljem nivou. Neka korisnik pritisne F5 ...sta da mu radim. (Mada u tom slucaju nece videti validne podatke dok sam ne osvezi stranicu.)

Zahvaljujem svima koji su dali svoj doprinos na ovoj temi.
[ aleksandarpopov @ 13.01.2008. 12:28 ] @
Na nacin kako ti hoces ne mozes to da uradis (mozda eventualno .NET 3.5 WPF ako moze nekako, nisam stigao jos dotle).
Pogledaj ovo: http://www.asp.net/learn/ajax-videos/video-182.aspx
[ Shadowed @ 13.01.2008. 12:46 ] @
ajaalba, nije da necemo da ti detaljisemo, vec je ajax cela jedna oblast. Neko bi mogao da ti mozda uradi taj primer ali ces kod neceg opet zapeti. Mislim, ako neko hoce, nema problema, ja bih, ali ni ja ne znam ajax bas dobro.
[ Predrag Glumac @ 13.01.2008. 14:36 ] @
Citat:
ajaalba: Potpuno vas razumem ako vas mrzi detaljnija rasprava sa mnom na ovu temuna na bilo kom daljem nivou. Neka korisnik pritisne F5 ...sta da mu radim. (Mada u tom slucaju nece videti validne podatke dok sam ne osvezi stranicu.)


Vec sam rekao da ti je koliko toliko resenje da stavis tag metadata refresh i stranica ce se samo osvezavati u odredjenom intervalu. Nazalost ni meni AJAX nije jaca strana
[ _prompt @ 13.01.2008. 17:21 ] @
Evo ukratko, instaliraj ASP AJAX Extension, izaberi AJAX enabled web site(ovo cini mi se u .NET 3.5
nije potrebno) stavi na stranicu Timer, ScriptManager, UpdatePanel i unutar njega kontrole koje zelis da se
osvezavaju. Timer-u podesi vreme i unutar Timer tick event-a implementiraj kako ce se osvezavati.

Za neko detaljisanje valjda ce se javiti neko iskusniji sa ASP.NET-om, ja vise radim na desktop aplikacijama
i vise ih volim :).

Nadam se da ti je pomoglo koliko toliko ili barem uputilo.
[ ajaalba @ 13.01.2008. 19:45 ] @
Hvala na savetima.
Zadubicu se u ovu materiju, kada budem imao vise vremena .... sto u mom slucaju znaci za par meseci...

Opet hvala svima na podrsci.