Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté.

Hasonló dokumentumok
Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Objektumrelációs adatkezelés (Entity Framework) Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Bevezetés: az SQL-be

Entity Framework + LINQ oktatási segédlet

ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

Vizuális programozás gyakorlat

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Entity Framework alapú adatbáziselérés

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Enterprise JavaBeans 1.4 platform (EJB 2.0)

Célkitűzések Az Oracle10 g felépítésének, használatának alapszíntű megismerése

Adatbázis kezelés alapjai I.

Adatbázisok webalkalmazásokban

Webes alkalmazások fejlesztése 6. előadás. Weblapok fejlesztése és architektúrája (ASP.NET)

Adatmodellezés. 1. Fogalmi modell

Hozzunk létre két rekordot a táblában, majd véglegesítsünk (commit):

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Entity Framework alapú adatbáziselérés

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Szoftvertechnolo gia 7. gyakorlat

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

A feladatok kitűzése és megoldása előtt néhány szó az alkalmazásokban használt eszközökről. ADO.NET osztályai

Adatbázis, adatbázis-kezelő

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Bevezetés az SQL-be. Tankönyv: Ullman-Widom: Adatbázisrendszerek Alapvetés Második, átdolgozott kiadás, Panem, 2009

MDAC - Microsoft Data Access Components

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Microsoft SQL Server telepítése

1. beadandó feladat dokumentáció

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

BGF. 4. Mi tartozik az adatmodellek szerkezeti elemei

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET Core) Cserép Máté

A.NET keretrendszer (.NET Framework) három alapvetõ összetevõbõl áll:

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Adatbázis kezelés Delphiben. SQL lekérdezések

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

BBS-INFO Kiadó

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Az SQL*Plus használata

B I T M A N B I v: T M A N

Adatbázis rendszerek I

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Adatbáziskezelő-szerver. Relációs adatbázis-kezelők SQL. Házi feladat. Relációs adatszerkezet

A könyv tartalomjegyzéke

Adatbázisok I. Jánosi-Rancz Katalin Tünde 327A 1-1

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

SQL- Utasítások csoportosítása Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

Adatbáziskezelı-szerver SQL. Relációs adatbázis-kezelık. Relációs adatszerkezet. Házi feladat

ADATBÁZIS-KEZELÉS FÉLÉVES FELADAT

Programozás. Adatbázis-kezelés (alapok) Fodor Attila

3. Beadandó feladat dokumentáció

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

BEVEZETÉS Az objektum fogalma

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

FÉLÉVES FELADAT KÖVETELMÉNYEK

LOGISZTIKAI ADATBÁZIS RENDSZEREK BEVEZETÉS

Adatbázis Rendszerek I. 9. SQL alapok (DDL esettanulmány)

Adatbázisok* tulajdonságai

Alkalmazás technológiai frissítés migrációs és üzemeltetési tapasztalatok

Access adatbázis elérése OLE DB-n keresztül

5. Gyakorlat. 5.1 Hálós adatbázis modell műveleti része. NDQL, hálós lekérdező nyelv:

Adatbázis Rendszerek II. 8. Gyakorló környezet

AB1 ZH mintafeladatok. 6. Minősítse az állításokat! I-igaz, H-hamis

Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET)

Adatbázis-kezelés ODBC driverrel

Adatbáziskezelés Delphi 5 alatt. Bese Antal

Adatbázis használata PHP-ből

Az adatok a vállalat kulcsfontosságú erőforrásai. Az információs rendszer adatai kezelésének két alapvető változata:

Webes alkalmazások fejlesztése 5. előadás. Adatbevitel és validáció (ASP.NET) Cserép Máté.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

SQL DDL-1: táblák és megszorítások

Adatbázis-kezelés. Harmadik előadás

Adatbázis-kezelő rendszerek. dr. Siki Zoltán

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

Szathmáry László Debreceni Egyetem Informatikai Kar

Windows rendszeradminisztráció és Microsoft szerveralkalmazások támogatása. 5. óra. Kocsis Gergely, Supák Zoltán

Adatbázismodellek. 1. ábra Hierarchikus modell

Adatbázisok - 1. előadás

Perzisztencia. ANTAL Margit. Sapientia - EMTE. ANTAL Margit Java technológiák 11. előadás Perzisztencia

Döbrönte Zoltán. Data Vault alapú adattárház - Fél óra alatt. DMS Consulting Kft.

Informatikai képzés Információs rendszerek dr. Hajas Csilla (ELTE IK)

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 3. előadás Objektumrelációs adatkezelés (Entity Framework) Cserép Máté mcserep@inf.elte.hu http://mcserep.web.elte.hu Készült Giachetta Roberto jegyzete alapján http://www.inf.elte.hu/karunkrol/digitkonyv/

Microsoft SQL Server A Microsoft rendelkezik saját SQL adatbázis-kezelő megoldással, a Microsoft SQL Serverrel (MSSQL) az SQL Server Management Studio az alapvető kliens eszköz, de használható Visual Studio is (View/Server Explorer, Tools/Sql Server) saját adatkezelő nyelve van (Transact-SQL), amely kompatibilis az SQL szabvánnyal tartalmaz pár speciális utasítást/típust is, pl. automatikus sorszámozást az IDENTITY utasítással a felhasználó-kezelés támogatja az egyedi fiókokat és Windows authentikációt ELTE IK, Webes alkalmazások fejlesztése 3:2

Az ADO.NET A.NET keretrendszerben az adatbázisokkal kapcsolatos adatelérésért az ADO.NET alrendszer biztosítja elődje az ADO (ActiveX Data Objects) számos lehetőséget ad az adatok kezelésére, az egyszerű SQL utasítások végrehajtásától az összetett objektumrelációs adatmodellekig az egyes adatbázis-kezelőket külön adapterek támogatják, amelyek tetszőlegesen bővíthetőek a közös komponensek a System.Data névtérben, az adatbázis-függő komponensek külön névterekben helyezkednek el (pl. System.Data.SqlClient, System.Data.OleDb) ELTE IK, Webes alkalmazások fejlesztése 3:3

Adatbázis kapcsolat Az adatbázis-kapcsolatot egyben, szöveges formában adjuk meg (connection string) általában tartalmazza a szerver helyét, az adatbázis nevét, a kapcsolódó adatait (felhasználónév/jelszó) a pontos tartalom adatbázis-kezelőnként változik pl.: "Server=localhost;Database=myDataBase; User Id=myUser;Password=myPassword;" // SQL Server standard biztonsággal "Server=127.0.0.1;Port=5432;Database=myDataBase; Integrated Security=true;" // PostgreSQL Windows authentikációval ELTE IK, Webes alkalmazások fejlesztése 3:4

Adatkezelési megoldások Az adatbázisok kezelésének több módja adott a.net keretrendszerben natív kapcsolat: direkt SQL utasítások végrehajtása a fizikai adatbázison ELTE IK, Webes alkalmazások fejlesztése 3:5

Natív kapcsolatok A natív (direkt) kapcsolat lehetővé teszi adatbázis lekérdezések (SQL) végrehajtását a fizikai adatbázison előnyei: hatékony erőforrás-felhasználás, közvetlen kommunikáció hátrányai: SQL ismerete szükséges, az utasítások a tényleges adatokon futnak (így állandó kapcsolat szükséges az adatbázissal), összetett tevékenységek leírása nehézkes alkalmazás perzisztencia lekérdezés eredmény adatforrás ELTE IK, Webes alkalmazások fejlesztése 3:6

Natív kapcsolatok A kapcsolódást az adatbázishoz az SqlConnection osztály biztosítja a megfelelő kapcsolati szöveg segítségével, pl.: SqlConnection con = new SqlConnection(" "); Az adott kapcsolatban az SqlCommand osztály segítségével tudunk parancsokat létrehozni a CommandText tulajdonság tárolja az utasítást a végrehajtás a parancsokra különféleképpen történik az ExecuteNonQuery() a nem lekérdezés jellegű utasításokat futtatja az ExecuteScalar() az egy eredményt lekérdező utasításokat futtatja ELTE IK, Webes alkalmazások fejlesztése 3:7

Natív kapcsolatok az ExecuteReader() az általános lekérdezéseket futtatja, az eredményt egy SqlDataReader olvasóobjektumba helyezi, amellyel soronként olvasunk Pl.: SqlCommand command = con.createcommand(); command.commandtext = "select * from MyTable"; SqlDataReader reader = command.executereader(); while (reader.read()){ // amíg tudunk olvasni következő sort Console.WriteLine(reader.GetInt32(0) + ", " + reader.getstring(1)); // megfelelően lekérjük az oszlopok tartalmát }; ELTE IK, Webes alkalmazások fejlesztése 3:8

Adatkezelési megoldások Az adatbázisok kezelésének több módja adott a.net keretrendszerben natív kapcsolat: direkt SQL utasítások végrehajtása a fizikai adatbázison logikai relációs modell: a fizikai adatbázis szerveződésének felépítése és adattárolás a memóriában ELTE IK, Webes alkalmazások fejlesztése 3:9

Logikai relációs modell Az adatbázis fizikai szerveződését a programkódban általános típusokra tükrözzük a System.Data névtérből: az adatbázisoknak a DataSet, a tábláknak a DataTable kerül megfeleltetésre, a sorokat a DataRow, a mezőket a DataColumn típus reprezentálja, relációs kapcsolatok a DataRelation, egyéb megszorítások a Constraint objektumokkal írhatók le. A DataSet-be az adatok a DataAdapter-en keresztül kerülnek betöltésre és a módosítások szinkronizálásra az adatbázissal. Az értékek nem erősen típusozottak (Object). ELTE IK, Webes alkalmazások fejlesztése 3:10

Logikai relációs modell létrehozása Pl. (adatbázis): create table Customer( -- tábla létrehozása -- tábla oszlopai Email VARCHAR(MAX) PRIMARY KEY, -- elsődleges kulcs Name VARCHAR(50) ); ELTE IK, Webes alkalmazások fejlesztése 3:11

Logikai relációs modell létrehozása Pl. (kód): // a connection érvényes SqlConnection objektum string querystring = "SELECT * FROM Customers"; SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection); DataSet dataset = new DataSet(); adapter.fill(dataset, "Customers"); DataTable table = dataset.tables["customers"]; DataRow newrow = table.newrow(); newrow["email"] = "mcserep@inf.elte.hu"; newrow["name"] = "Máté"; // sor hozzáadása a kollekcióhoz table.rows.add(newrow); ELTE IK, Webes alkalmazások fejlesztése 3:12

Logikai relációs modell lekérdezése Pl. (kód): // az összes tábla összes rekordjának kiírása foreach(datatable table in dataset.tables) { foreach(datarow row in table.rows) { foreach(datacolumn column in table.columns) { Console.WriteLine(row[column]); } } } ELTE IK, Webes alkalmazások fejlesztése 3:13

Adatkezelési megoldások Az adatbázisok kezelésének több módja adott a.net keretrendszerben natív kapcsolat: direkt SQL utasítások végrehajtása a fizikai adatbázison logikai relációs modell: a fizikai adatbázis szerveződésének felépítése és adattárolás a memóriában egyszerű objektumrelációs modell (LINQ to SQL): az adatbázis-információk leképezése objektumorientált szerkezetre a sémának megfelelően ELTE IK, Webes alkalmazások fejlesztése 3:14

Objektumrelációs adatkezelés Az adatkezelő programokat általában objektumorientáltan építjük fel, így célszerű, hogy az adatkezelés is így történjen A relációs adatbázisokban az adatokat táblákba csoportosítjuk, amely meghatározza az adatok sémáját, felépítésének módját, azaz típusát egy sor tárolja egy adott elem adatait, azaz a sor a típus példánya Ez a megfeleltetés könnyen átültethető objektumorientált környezetre, a sorok adják az objektumokat, a táblák az osztályokat Table «property» + ColumnA() :int + ColumnB() :string + ColumnC() :bool ELTE IK, Webes alkalmazások fejlesztése 3:15

Objektumrelációs adatkezelés A megfeleltetést objektumrelációs leképezésnek (objectrelational mapping, ORM) nevezzük magas szintű transzformációját adja az adatbázisnak, amely a programban könnyen használható ugyanakkor szabályozza az adatok kezelésének módját a létrejött osztályok csak adatokat tárolnak, műveleteket nem végeznek alkalmazás perzisztencia objektumrelációs leképezés adatforrás ELTE IK, Webes alkalmazások fejlesztése 3:16

Adatkezelési megoldások Az adatbázisok kezelésének több módja adott a.net keretrendszerben natív kapcsolat: direkt SQL utasítások végrehajtása a fizikai adatbázison logikai relációs modell: a fizikai adatbázis szerveződésének felépítése és adattárolás a memóriában egyszerű objektumrelációs modell (LINQ to SQL): az adatbázis-információk leképezése objektumorientált szerkezetre a sémának megfelelően entitás alapú objektumrelációs modell (ADO.NET Entity Framework): az adatbázis-információk speciális, paraméterezhető leképezése objektumorientált szerkezetre ELTE IK, Webes alkalmazások fejlesztése 3:17

ADO.NET Entity Framework Az ADO.NET Entity Framework valósítja meg az adatok összetett, objektumrelációs leképezését alapja az entitás adatmodell (Entity Data Model, EDM), amely leírja az entitások társítását az adatforrás elemeihez általában egy entitás egy tábla sorának objektumorientált reprezentációja, de ez tetszőlegesen variálható az entitások között kapcsolatok állíthatóak fel, amely lehet asszociáció, vagy öröklődés támogatja a nyelvbe ágyazott lekérdezéseket (LINQ), a dinamikus adatbetöltést, az aszinkron adatkezelést névtere a System.Data.Entity ELTE IK, Webes alkalmazások fejlesztése 3:18

Entitás adatmodellek létrehozása A modell létrehozására három megközelítési mód áll rendelkezésünkre: adatbázis alapján (database first): az adatbázis-szerkezet leképezése az entitás modellre (az adatbázis séma alapján generálódik a modell) tervezés alapján (model first): a modellt manuálisan építjük fel és állítjuk be a kapcsolatokat (a modell alapján generálható az adatbázis séma) kód alapján (code first): a modellt kódban hozzuk létre A modellben, illetve az adatbázis sémában történt változtatások szinkronizálhatóak, mindkettő könnyen módosítható ELTE IK, Webes alkalmazások fejlesztése 3:19

Entitás adatmodellek létrehozása Pl. (adatbázis): create table Customer( -- tábla létrehozása -- tábla oszlopai Email VARCHAR(MAX) PRIMARY KEY, -- elsődleges kulcs Name VARCHAR(50), AddressId INTEGER, ); -- idegen kulcs CONSTRAINT CustomerToAddress FOREIGN KEY (AddressId) REFERENCES Address (Id) ELTE IK, Webes alkalmazások fejlesztése 3:20

Entitás adatmodellek létrehozása Pl. (kód): class Customer // entitástípus létrehozása { [Key] // elsődleges kulcs public String Email { get; set; } [StringLength(50)] // megszorítás public String Name { get; set; } [ForeignKey("AddressId")] // idegen kulcs public Address Address { get; set; } } public ICollection<Order> Orders { get; set; } ELTE IK, Webes alkalmazások fejlesztése 3:21

Entitás adatmodellek használata Az entitásokat egy adatbázis modell (DbContext) felügyeli, amelyben eltároljuk az adatbázis táblákat (DbSet) egy aszinkron modellt biztosít, a változtatások csak külön hívásra (SaveChanges) mentődnek az adatbázisba pl.: public class SalesContext : DbContext { // kezelő létrehozása public DbSet<Customer> Customers { get; set; } // adatbázisbeli tábla } ELTE IK, Webes alkalmazások fejlesztése 3:22

Entitás adatmodellek használata Az adattábla (DbSet) biztosítja lekérdezések futtatását, adatok kezelését létrehozás (Create), hozzáadás (Add, Attach), keresés (Find), módosítás, törlés (Remove) az adatokat és a lekérdezéseket lusta módon kezeli az adatok csak lekérdezés hatására töltődnek a memóriába, de betölthetjük őket előre (Load) a LINQ lekérdezések átalakulnak SQL utasítássá, és közvetlenül az adatbázison futnak egy tábla nem tárolja a csatolt adatokat, azok betöltése (Include) ELTE IK, Webes alkalmazások fejlesztése 3:23

Entitás adatmodellek használata Pl.: SalesContext db = new SalesContext(); IEnumreable<Customer> customer = Db.Customers.FirstOrDefault(cust => cust.email == "mcserep@inf.elte.hu"); // LINQ lekérdezés if (customer == null) { customer = new Customer { Name = "Cserép Máté", Email = "mcserep@inf.elte.hu" }; db.customers.add(customer); // entitás létrehozása és felvétele db.savechanges(); // változások elmentése } ELTE IK, Webes alkalmazások fejlesztése 3:24

Entitás adatmodellek használata Pl.: IQuery<Customer> query = db.customers.include(cust => cust.address); // a megadott tulajdonságok (csatolt adatok) // is betöltésre kerülnek, hasonlóan // táblanévvel:.include("address") Boolean anybudapest = query.any(cust => cust.address.city == "Budapest"); // a lekérdezés az adatbázisban fut query.load(); // adatok betöltése anybudapest = query.any(cust => cust.address.city == "Budapest"); // a lekérdezés a memóriában fut ELTE IK, Webes alkalmazások fejlesztése 3:25

Példa Feladat: Valósítsuk meg egy utazási ügynökség weblapját, amelyben apartmanok között böngészhetünk. a főoldalon (Index) az épületek alapvető adatai listázódnak, amit szűrhetünk, a részletek oldalon (Details) egy épület apartmanjai listázódnak az oldalt egy vezérlő (HomeController) irányítja, amely három akciót definiál: minden listázása (Index), egy város épületeinek listázása (List), egy épület részleteinek lekérése (Details) a városok listázásához felhasználjuk a ViewBag tulajdonságot az adatokat adatbázisban (TravelAgency) tároljuk ELTE IK, Webes alkalmazások fejlesztése 3:26

Példa Tervezés (adatbázis): a City tábla tárolja a városok adatait tartalmazza a Building tábla az épületek adatait tartalmazza, benne a város azonosítójával az Apartment tábla az apartman adatokat tárolja, benne az épület azonosítójával a BuildingImage tábla tárolja az épületek bemutató képeit, minden képből egy nagyobb, és egy kisebb változatot, valamint az épület azonosítóját az elsődleges kulcsokat automatikusan generáljuk az adatbázist entitásmodell segítségével töltjük be az alkalmazásban ELTE IK, Webes alkalmazások fejlesztése 3:27

Példa Tervezés (adatbázis): ELTE IK, Webes alkalmazások fejlesztése 3:28

Példa Tervezés (alkalmazás): Controller Controllers::HomeController - _entities :TravelAgencyEntities + HomeController() + Index() :ActionResult + List(Int32) :ActionResult + Details(Int32) :ActionResult View Views::Index View Views::Details -_entities DbContext Models::TravelAgencyEntities ELTE IK, Webes alkalmazások fejlesztése 3:29

Példa Megvalósítás (HomeController.cs): public ActionResult List(Int32 cityid) { // ha hibás az azonosító if (!_entities.city.any(c => c.id == cityid)) return HttpNotFound(); // átirányítjuk a nem talált oldalra } // megkeressük a megfelelő város azonosítókat return View("Index", _entities.building.include("city").where(b => b.cityid == cityid)); ELTE IK, Webes alkalmazások fejlesztése 3:30

Példa Megvalósítás (Index.cshtml): <ul> @* felsoroljuk a városokat *@ @foreach (City city in ViewBag.Cities) { <li> @* létrehozunk egy linket minden városra *@ @Html.ActionLink(city.Name, "List", new { cityid = city.id }) </li> } </ul> ELTE IK, Webes alkalmazások fejlesztése 3:31