Šta je novo?

ASP par pitanja

milos_r

Čuven
Učlanjen(a)
31.10.2004
Poruke
487
Poena
619
Pozdrav,
imao bih par pitanja vezano za neke mogucnosti u asp-u. Prvo evo ovako
Dakle ako na jednoj stranici prikazujem u GridView kontroli podatke iz tabele koja se zove Forme na ovaj nacin:
Kod:
    <asp:GridView ID="gd" AllowPaging="true" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="FormaID" Visible="false" />
            <asp:BoundField DataField="KorisnikID"  HeaderText="Formu uneo u sistem" />
            <asp:BoundField DataField="DatumUnosa" HeaderText="Datum unosa forme" />
            <asp:BoundField DataField="DuzinaPrekida" HeaderText="Naziv forme"/>
            <asp:BoundField DataField="OpisRadova" HeaderText="Opis forme"/>
        </Columns>
    </asp:GridView>
A podaci u tabeli su za polje KorisnikID int vrednosti. Kako da prikazem tu umesto tih brojeva Ime i Prezime korisnika a ono je upisano u drugoj tabeli "Korinici".
Evo kako to izgleda a voleo bih da umesto ovog keca mogu da ispisem ime i prezime korisnika iz druge tabele.
28kpmdj.jpg

Druga stvar koja me muci je vezana za logovanje.
Napravio sam login stranu koja uspesno obavlja ovu stvar kontktira bazu i ako postoji korisnik prebaci ga na neku od unutrasnjih strani. Ja sam sada dodatno napravio da kad se korsnik loguje taj objekat ubacim u sesiju. Dakle uradio sam sledece:
Kod:
Session["Korisnik"] = objekat tipa korisnik koji je logovan
I to mi lepo ispisuje na svakoj stranici unutra koji je logovan korisnik.
Medjutim ono sto nisam uspeo da realizujem je kako da se korisnik izloguje sa sistema i kako da zabranim ulazak na unutrasnje strane tako sto ce neko direktno da upise celu adresu u pretrazivacu. ovde mislim na
Kod:
www.aplikacija.com/login.aspx
www.aplikacija.com/unos.aspx
Gde prva adresa treba da uvek bude dostupna a druge nedostupne ako je objekat tipa korisnik u sesiji jednak null.
Ja sam probao sledece varijante:
na master stranici sam stavio dugme izloguj se i ubacio sledeci kod u .cs fajl:
Kod:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Sesija.Korisnik == null)
            {
                //Upozorenje.Prikazi("Nemožete pristupiti ovoj stranici ako niste logovani");
                Page.Response.Redirect("Login.aspx");
            }
            else
            {
                lblUlogovanKorisnik.Text = Sesija.Korisnik.Prezime + " " + Sesija.Korisnik.Ime;
            }

        }

        protected void btnIzlogujSe_Click(object sender, EventArgs e)
        {
            Page.Response.Redirect("Login.aspx");
            Session.RemoveAll();
        }
Ako prvi put dolazim na aplikaciju i pokusam da udjem direktno na neku stranicu koja je ispod ove master onda me lepo redirektuje na login ali ako se jednom logujem na sistem i udjem na te stranice ovo dugme izloguj se neradi mnogo toga pametnog, samo me prebaci na stranu za logovanje medjutim ako upisme gore direktno u pretrazivacu naziv neke stranice opet uspevam da dodjem do nje i ispisuje mi da sam i dalje u sesiji?
Zna li iko kako da resim ova dva problema?
Milos
 
A podaci u tabeli su za polje KorisnikID int vrednosti. Kako da prikazem tu umesto tih brojeva Ime i Prezime korisnika a ono je upisano u drugoj tabeli "Korinici".
Evo kako to izgleda a voleo bih da umesto ovog keca mogu da ispisem ime i prezime korisnika iz druge tabele.
28kpmdj.jpg

Nemam iskustva sa ASP.NET-om ali trebalo bi da je logika slična kao i kod Windows aplikacija. Dakle, promeni upit kojim pristupaš podacima. Nema to veze sa ASP-om već sa SQL-om. Znači nećeš da prikazuješ kolonu KorisnikID već kolone Ime i Prezime (ako su odvojene) iz te druge tabele. Daj taj upit koji koristiš i šemu baze pa ćemo dodati ono što treba.

Druga stvar koja me muci je vezana za logovanje.
.....

Ovo neka ti odgovori neko ko radi WEB programiranje. :)
 
Ček da objasnim malo bolje ovo za ispisivanje imena i prezimena.
Dakle postoje dve tabele u bazi podtaka.
--tabela korisnici:
korisnikID
ime
prezime
...
--tabela forme:
formaID
korisnikID
duzinaPrekida
opisPoslova

Ja u onom GridView kotroli dakle ispisujem podatke iz ove druge tabele sto se da videti iz prilozenog. Sad u stvari meni treba nacin da u polje korisnikID upisem string koji ja zelim. Meni nije teso da napravim funkciju (U stvari napravicu je i okaciti ovde) koja ce primati int id i vracati formatiran string Ime + Prezime korisnika ali kako taj string upisati u to polje GridView kontrole umesto tih brojeva?
evo funkcije recimo:
Kod:
        public String VratiKorisnika(int korisnikID)
        {
            string query = String.Format("SELECT * FROM tabelaKorisnici WHERE korisnikID='{0}'", korisnikID);

            Korisnik korisnik = new Korisnik();
            SqlCommand sqlComm;
            SqlDataReader reader;
            SqlConnection sqlConn = new SqlConnection(connString);          
            sqlComm.Connection = sqlConn;
            sqlComm.CommandType = CommandType.Text;
            sqlConn.Open();
            reader = sqlComm.ExecuteReader();
            while (reader.Read())
            {
                    korisnik.Ime = reader.GetString(3);
                    korisnik.Prezime = reader.GetString(4);
            }

           sqlCmd.Connection.Close();

            return korisnik.Ime + " " + korisnik.Prezime;
        }
Ovakva nekakava funkcija bi meni lako vratila to sto zelim ali kako to ubaciti u to polje GridView kontrole.
Kad bi postojala neka opcija tipa
Kod:
    <asp:GridView ID="gd" AllowPaging="true" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="FormaID" Visible="false" />
            <asp:BoundField DataField="KorisnikID"  HeaderText="Formu uneo u sistem"  [B][SIZE="4"]value= VratiKorisnika(korisnikID)[/SIZE][/B] />
            <asp:BoundField DataField="DatumUnosa" HeaderText="Datum unosa forme" />
            <asp:BoundField DataField="DuzinaPrekida" HeaderText="Naziv forme"/>
            <asp:BoundField DataField="OpisRadova" HeaderText="Opis forme"/>
        </Columns>
    </asp:GridView>
Tako nesto meni treba opcija da pozovem ovu funkciju kod svakog ispisivanja ovog polja
Ovo za logovanje nije toliko bitna stvar to u principu radi tako da ni nemoram nista da menjam.
Hvala svima unapred na odgovorima
Milos
 
Reseno za ispis imena i prezimena

Ovo za ime i prezime sam resio i nije ispalo na kraju tako tesko.
asp za GridView ima ugradjene gomilu predefinisanih funkcija, a jedna od njih mi je ovo omogucila.
Kod:
        protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int korisnikID = Convert.ToInt32(e.Row.Cells[1].Text);
                string ImePrezime = KonekcijaKaBazi.imePrezime(korisnikID);
                e.Row.Cells[1].Text = ImePrezime;              
            }
        }
Par linija koda i sve gotovo :)
Ono sa logovanjem je i dalje problem pa ako neko zna nek javi kako to da izvedem.
Pozdrav
 
Taman sam počeo da pišem kad vidim da si dodao nešto. :)

A hteo sam da ti predložim da promeniš čitavu logiku. :D
TJ. da napraviš složeni upit i da ti on sve to rešava.
Dalje, da napraviš uskladištenu proceduru, da napraviš troslojnu arhitekturu itd. ali ako ovo radi onda cepaj dalje. ;)
 
Ili da predjes na neki krsten jezik za te stvari kao sto jePHP :)
 
Ako prvi put dolazim na aplikaciju i pokusam da udjem direktno na neku stranicu koja je ispod ove master onda me lepo redirektuje na login ali ako se jednom logujem na sistem i udjem na te stranice ovo dugme izloguj se neradi mnogo toga pametnog, samo me prebaci na stranu za logovanje medjutim ako upisme gore direktno u pretrazivacu naziv neke stranice opet uspevam da dodjem do nje i ispisuje mi da sam i dalje u sesiji?

Napravi web user control koji neće imati ništa od standardnih kontrola (textboxovi,labele) već će samo u PageLoad da proverava nešto tipa

Kod:
if (Session["Username"] != null)
{
 // sve je ok
}
else
{
// korisnik nije ulogovan
Response.Redirect("AccessDenied.aspx");
}

Onda tu kontrolu dodaj na master stranicu, pa će se pri svakom učitavanju (bilo koje) stranice proveravati da li je korisnik ulogovan
 
Napravi web user control koji neće imati ništa od standardnih kontrola (textboxovi,labele) već će samo u PageLoad da proverava nešto tipa

Kod:
if (Session["Username"] != null)
{
 // sve je ok
}
else
{
// korisnik nije ulogovan
Response.Redirect("AccessDenied.aspx");
}

Onda tu kontrolu dodaj na master stranicu, pa će se pri svakom učitavanju (bilo koje) stranice proveravati da li je korisnik ulogovan

Ne razumem bas najbolje sta si mi sada rekao. Tu proveru sto si mi ti rekao ja vec imam ubacenu u .cs fajl za master stranicu eno napisao sam u prvom postu. Ubacio sam to u page_load metodu koja se poziva prilikom startovanja stranice. I napisao sam da mi ta provera lepo radi prilikom prvog startovanja aplikacije ali nastaje problem da nemogu ocigledno posle da izbacim iz sesije korisnika nijednom od postojecih metoda koje se za to koriste. Nekim cudom sesija uvek zadrzava tog korisnika u sebi sve dok se ne ugasi browser.
I ti kutija sad kad si uzeo KT-a odmah se pravis pametan :p. Ja da sam mogao da biram u kojem cu jeziku ovo raditi svakako nebih ni u .NET-u ni u php-u, vec lepo ko covek u javi.
 
U primeru iz prvog posta problem je sto brises stvari iz sesije posle redirect-a. Moje skromno znanje ASP NET-a (i mala pomoc google-a) kaze da pozivanje Response.Redirect baca System.Threading.ThreadAbortException, tako da mozes ili da hvatas taj izuzetak ili da jednostavno odradis sve pre redirect-a.

http://msdn.microsoft.com/en-us/library/a8wa7sdt(VS.80).aspx
Redirect calls End which raises a ThreadAbortException exception upon completion.

Takodje, mislim da je neki standardni nacin da se koriste vec ugradjene kontrole za login:
http://msdn.microsoft.com/en-us/library/ms178331.aspx
 
Poslednja izmena:
U primeru iz prvog posta problem je sto brises stvari iz sesije posle redirect-a. Moje skromno znanje ASP NET-a (i mala pomoc google-a) kaze da pozivanje Response.Redirect baca System.Threading.ThreadAbortException, tako da mozes ili da hvatas taj izuzetak ili da jednostavno odradis sve pre redirect-a.

http://msdn.microsoft.com/en-us/library/a8wa7sdt(VS.80).aspx


Takodje, mislim da je neki standardni nacin da se koriste vec ugradjene kontrole za login:
http://msdn.microsoft.com/en-us/library/ms178331.aspx
Bravo to je resenje problema.
umesto:
Kod:
        protected void btnIzlogujSe_Click(object sender, EventArgs e)
        {
            Page.Response.Redirect("Login.aspx");  
            Session.RemoveAll();               
        }
trebalo je samo promeniti redosled komandi i sve radi.
Kod:
protected void btnIzlogujSe_Click(object sender, EventArgs e)
        {
            Session.RemoveAll();
            Page.Response.Redirect("Login.aspx");                            
        }
Hvala na pomoci
 
Vrh Dno