představení nového seriálu o ASP .net MVc - from zero to hero

Marian Benčat       02.10.2015       SQL, Entity Framework, LINQ, Testování, Komponenty, Architektura, Optimalizace, Threading, HTTP/HTML, Databáze, I/O operace, Bezpečnost, .NET, JavaScript, TFS, PostSharp a AOP, Debugging, Knihovny, Kompilátor       20864 zobrazení

Dlouho jsem přemýšlel nad tím, jak začít můj historicky první příspěvek vývojářské komunitě. Jak začít takový seriál a hlavně – proč vůbec nějaký seriál napsat, když existuje všude plno nejrůznějších knížek, tutoriálů, blogů, příruček a všeho možného. Tato otázka mě kupodivu přivedla  k odpovědi.

Začnu  tedy tím, že vám popíši, co mě k tomuto kroku vede, čemu se chystám v tomto seriálu věnovat a čeho se snažím dosáhnout.

 

Klidné moře nedělá dobré Námořníky

Každý programátor to zná – chce se naučit nějaké nové technologie, postupy, frameworky, případně rovnou nový programovací jazyk. Postup bývá v libovolném z těchto případů z pravidla následující:

  • Stažení učebnice
  • Procházení tutoriálů
  • Shlédnutí naučných videí
  • Procházení příkladů
  • Docházení na kurzy

Takovéto kurzy jsou výborné na to, co v tu konkrétní chvíli potřebujete  - naučit se něco krok za krokem. V okamžiku, kdy budete mít tyto znalosti, můžete začít vesele vyvíjet vaše vlastní aplikace. Pokud budete mít štěstí, nedojde k žádnému problému a celý vývoj aplikace od začátku až do konce proletíte…

Pokud mít štěstí nebudete, strávíte hodinu například tím, proč se vám někde něco nezobrazilo (například váš Model při scaffoldingu). Takovéto problémy budete muset řešit, zajdete tedy na stackoverflow, Google a podobné zdroje, kde najdete při trošce štěstí odpověď, proč vám to nefunguje. Pokud mít to štěstí nebudete, strávíte hodiny hledáním, zkoušením… Toto je způsobeno především tím, že nemáte prozatím zkušenost s tímto daným problémem. Naučíte se jej vyřešit až v okamžiku, kdy tento problém nastane a vy budete mít pár hodin před deadlinem projektu. První věcí, na kterou bych se tedy ve svém seriál chtěl zaměřit, je předat vám předem zkušenosti s nějakými pitfally, se kterými se pravděpodobně setkáte.

Co se v žádné knížce nenaučíte, je rovněž dělat věci správně – především tak, abyste si ušetřili práci, nebo předcházeli nějakým problémům do budoucna. Zde bych především zmínil nějaké problémy s udržováním kvality kódu, jeho rozšiřitelností a přehledností. K tomuto vám především pomohou určité zažité postupy, enterprise návrhové vzory a podobné informace, které načerpáte sice z knih pro vývoj a architekturu softwaru, ale ty číst při studiu .NETu pravděpodobně nebudete.

Mým hlavním cílem je tedy předat vám moje know-how, moje zkušenosti kterých jsem nabral právě při vývoji malých až těch největších softwarových projektů. Přál bych si, abyste je měli ideálně ihned a né až ten daný problém nastane.

 

Vím, že nic nevím

Velmi známá věta Sokrata, kterou lze nejlépe asi vyložit tak, že tím nejhorším co může člověka ohledně vědomostí potkat, je falešná myšlenka vědomosti. Proto to bylo pro autora takovým přínosem – zjistil, že se mýlil, že něco neví, že se má kam posouvat.

 Za ta léta, kdy se pohybuji v oboru, je pro mě kupodivu velkým přínosem situace, kdy zjistím, že něco neumím, případně – že to dělám špatně. V určitých ohledech se ale už dostávám do situace, kdy postrádám někoho, kdo mi poví “TYTYTY, takhle se to opravdu nedělá, přepiš to” a podobně.  Zde tedy leží můj první osobní důvod, proč chci psát tento seriál. Prosím vás tedy nyní… Reagujte mi na můj seriál, mínusujte, kritizujte, posílejte mi kypřící prášek v obálkách... ale vždy prosím dejte popis, co dělám podle vás špatně, co by šlo vylepšit. Je to pro mě ta nejlepší odměna, za mou práci zde na dotNETportalu – naberu tak pro mě – pro někoho, kdo se chce zlepšovat, to nejcennější – know-how. Netvrdím tedy, že mám patent na rozum, že vše dělám nejlépe. Za vaše objektivní a k věci komentáře, vám tedy předem děkuji.

A nakonec ta poslední a nejdůležitější motivace k sepsání tohoto seriálu – přeji si na .NET (C#) převézt programátory z ostatních technologií – především PHP, NodeJS, Django, Ruby on Rails. Nevidím totiž  jediný důvod, proč některé z nich i nadále používat – kromě nějakých Legacy systémů, či jiných historických důvodů. Toto se může zdát jako nějaký pokus o to, vyvolat zde nějakou hádku, co je lepší, co není atp. Já vás ale nebudu nutit přecházet z vámi milovaného PHP, chtěl bych ale, abyste tomu dali šanci a jsem nadmíru přesvědčený, že až poznáte doposud nepoznané, už vás nebudu muset o nic prosit a rádi zkusíte .NET i jako vaši hlavní produkční platformu. Důvody k tomu budou především následující:

  • komfort vývoje
  • rychlost vývoje
  • kvalita a přehlednost kódu
  • rychlost softwaru
  • naprostá samostatnost
  • samostatnost .NETu

 

Jak se o to pokusím

Nebudeme se zde učit programovat v C#, některé věci ovšem zmíníme, abych ukázal hlavní rozdíly oproti například PHP, NodeJS. V prvních dílech se také budeme učit základy ASP MVC, řešení bude tedy primitivní, jednoduché. V následujících částech seriálu však budeme předchozí řešení vylepšovat, ukážeme si různé finty, unfair tricky a podobné věci, které vám práci zpříjemní a především zkrátí.

Zatímco se vám budou zdát první části poměrně jednoduché, postupně přijdeme k těm složitým věcem a nakonec enterprise řešení, na co se tedy můžete těšit především?

 

  • Rozdíly C# oproti jiným jazykům
  • ASP MVC – view, model, controller
  • Razor, helpery, šablony
  • Scaffolding a AOP
  • Controllery, Routing, Binding, Validace
  • Data, LINQ, Enumerable, Queryable, Ajax
  • MVC lifecykle, filtry
  • Unit Testing, UI testing, Continuous integration
  • Threading model, Async, Hangfire
  • Dependency injection, IOC Container, Separation of concerns
  • RDM vs ADM, repozitáře, servisy, controllery
  • WebAPI
  • OData
  • T4 Templates
  • AngularJS a MVC
  • AngularJS, Typescript + T4

………

 

Vskutku, není toho málo. Nikdo netvrdil, že to bude seriál na 2 týdny Veselý obličej 

Aby tento článek nebyl jen tak úplně suchý, podíváme se zde rovnou na největší mínusy .NETu a zaměříme se na nepravdivá tvrzení.

 

Vývoj je drahý – vývojové nástroje, testovací servery

 

Do relativně nedávné doby tomu opravdu tak bylo. Především pokud jste to mysleli vážně a nechtěli vyvíjet na SharpDevelop, MonoDevelop, NecoDevelop atp. a chtěli jste vyvíjet pomocí Visual Studia. Licence nebyly vůbec levné a tak to bylo především pro malá vývojářská studia překážka, přes kterou nejel vlak.  Aniž by mi vyrostl nos, můžu s čistým svědomím říci, že lepší vývojářské IDE v současné době neexistuje. A co lépe… za určitých podmínek je i verze na úrovni professional zdarma. Mluvím zde o verzi Community, kterou microsoft uvolnil zcela zdarma  i pro komerční použití.

Jako podmínkou je, že lze v jedné firmě použít maximálně 5 licencí, pokud firma nedosahuje určitého obratu (1 milion dolarů ročně) a počet počítačů nepřekračuje 250. Pokud splňujete tyto podmínky – obzvláště ten o obratu ^_^, můžete visual studio zdarma používat i pro komerční účely. Zde je ale jedno menší ALE, které rovnou použiji pro ukázku značení pitfallu:

 

pitfall

Pokud vyvíjíte software pro klienta, který nesplňuje výše uvedené požadavky, nemůžete ani vy používat Visual Studio community.

 

Co se týče testovacích serverů – pro vývoj můžete používat vestavěný server přímo ve Visual Studiu, který vám prokáže opravdu dobrou službu a vesměs pro vás bude při vývoji dostačující.

Visual Studio 2015 Community můžete stáhnout níže, osobně vám však prozatím doporučuji stáhnout si verzi 2013 Community, jelikož je blíže Windows světu, kde velkou část práce udělá za vás. Verze 2015 se už trošku přibližuje Linuxovému multiplatformnímu světu, kde si všechno tvrdě odpracujete. Samozřejmě verze 2015 přináší i spousty výhod, ale ty prozatím bez utrápení se nevyužijete (multiplatformní vývoj, Windows 10 apps), nebo nejsou předmětem tohoto seriálu (Roslyn extensions).

Visual Studio 2015 Community

Visual Studio 2013 Community

 

Co se týče databáze, lze použít zdarma SQL Server Express, která s sebou sice přináší některá omezení, pravda je ale taková že pro malé i střední webové aplikace, vám to bude zcela stačit. Mezi hlavní omezení patří 10GB / databázi.

SQL Server Express lze stáhnout zde:

SQL Server Express

 

Pokud budete potřebovat nějaké “neprodukční” prostředí například na testování atp., vystačíte si bez větších problémů s IIS Express, což je konkurent Apache z maloměkkého světa.  Opět je zde několik omezení, pro neprodukční provoz vám to ale zcela stačí.

Pro více informací o IIS Express a stažení zde:

IIS Express

 

info

Jako náhradu za plnohodnotnou databázi lze použít tzv. LocalDB, tato databáze funguje pak jako běžný soubor na vašem webu, kam přímo vaše aplikace může zapisovat a pracovat s ní jako s normální databází, pro více informací je zde článek dotNetPortal kolegy:

sql server express user instances a sql server express localdb

Vesměs jakákoliv .NET aplikace má potom možnost hostit webový server přímo v sobě, přes tzv. self-host webové aplikace.

 

Hosting je drahý

Opět se jedná tak trošku o informaci založenou na historii, kdy nebyl .NET hosting tolika rozšířený a tak jednotlivé služby neměly tak přijatelné ceny. Dnes už je to jinak. I u nás v ČR seženete poměrně kvalitní hosting za krásné ceny, není tak pro vás těžké sehnat hosting:

  • Neomezeně webového prostoru
  • .NET 4.6 / Windows
  • Neomezená celková databáze
  • Maximální velikost 1 instance databáze 500MB

Za necelých 60,- Kč / měsíc.

 

Blackbox, serverové komponenty, viewstate

Na internetu najdete plno článků podobných tomuto:

http://www.biggleszx.com/2010/01/asp-net-sucks-huge-balls-and-i-hate-it/

http://blog.jdconley.com/2009/01/10-reasons-aspnet-webforms-suck.html

Plno stížností na blackbox, page lifecykle, viewstate, postback a další věci… Předně, tyto věci se týkají pouze technologie WebForms, u MVC ani WebPages na ně nenarazíte. Na rozdíl od .NET kapacit, které plně uznávám, jako Altair Valášek, Herceg – já WebForms vůbec nefandím a budiž jim země lehká (Webformsům, ne pánům programátorům Veselý obličej  - microsoft již nadále WebForms nebude vyvíjet).

WebForms měly v sobě plno krásných věcí, které dnešní nové technologie přináší jako obrovskou novinku, kterou všichni milují. jako například Binding, komponenty atp. přesto všechno, ale s sebou přinášely pár ohromných průšvihů…

Především co se týče nějakého rozdělení práce mezi více lidí – pro webového designéra, či frontend vývojáře, bylo nějaké stylování stránek, případně nějaká jednoduchá úprava úplné peklo… Vše poměrně silný blackbox, kde v tom lepším případě, kdy jste měli k dispozici zdrojové kódy komponenty, byla úprava o tom naučit se hodně věcí... v tom horším bez přístupu ke zdrojovým kódum, přes nějaké hackování na úrovni javascriptu...   Nějaké zakomponování nějaké složitější javascriptové knihovny, kde dochází k různým requestum, refreshum, redirectum atp., šlo rovněž kolikrát o pekelnou práci. Nebylo tedy nic příjemnějšího, než hledat hodinu, proč dochází v nějaké části stránky k nějakému reloadu, kde se bere postback atp. O porovnání MVC vs WebForms a proč je lepší je už nechat dožít, bude jistě ode mě také článek.

Přesto  bych chtěl říci, že největším problémem WebForms je, že se microsoft snažil  poskytnout vývojářům zvyklým na WinForms , podobný komfort a přístup k práci na weby – tedy chtěl vytvořit ViewBased řešení pro Action-based požadavky. Tedy web. Toto se snažil vyřešit přenesením stavu View na prohlížeč – pomocí view state... Nebudeme to dále rozpitvávat. S žádným z těchto podle mého “okovů”, se na MVC nepotkáte. Tam jsou okovy jiné, které ale obejdeme Veselý obličej

 

Není multiplatformní, Open source

Troufám si tvrdit, že co se týče nějakého rozložení na platformách, začíná .NET válcovat i Javu, která poněkud usíná na vavřínech. Pokud chcete vyvíjet nativní mobilní multiplatformní aplikace a máte dostatek financí, sáhnete po Xamarinu. Xamarin používá vlastní odnož Mono a Mono je implementace .NETu. Rovněž jistě znáte Unity 3D, populární engine na všech platformách. Unity používá rovněž variantu Mona. Že je tedy .NET silně vázaný na Windows, už delší dobu není pravda. Nás ale zajímá, jak je to, co se týče webů?

Microsoft investoval hodně času a financí na to, aby byl schopný jeho framework a především webové technologie schopné jet na jiných platformách, vzniklo tedy několik variant.NET frameworku , které jsou určitou měrou schopny jet na jiných platformách.

Zatímco u WebAPI  bych se už nebál použití na produkčním serveru, u MVC tomu tak není. Možnosti jsou stále poměrně omezené a ve stavu, že se na ně nelze prozatím plně spolehnout. Jsem ale přesvědčený o tom, že do roka už použitelné budou.  Tyto implementace frameworku jsou rovněž open source a lze si je stáhnout.

V současné době je .NET na ostatních platformách podobně jako například PHP na Mac OS X – jde to, ale občas to bolí.

 

Prosím, zanechte komentář, zda vás tento seriál zaujal / zaujme. Děkuji.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

 

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

Super

Jsem rád, že jste se do toho takhle pustil a jiste to budu sledovat. Osobně ty backend věci mě už nepřekvapí, ale jistě najdu mnohá poučení. Obvzláště kdýž je to pojato takto komplexně.

Stále měntálně bojuji ve stylu co stím "frontendem", protože JS tedy není vůbec můj šálek kávu, tak se těším na tuto část.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Dobrý den,

děkuji za podporu. Ohledně frontentu. Rád bych se zaměřoval ve svém seriáu především na využití TypeScriptu, Angularu a strongly-typed angularu, kde se bude velká část kódu generovat automaticky na základě C# kódu (například controlleru, anotací na viewmodelu atp.)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Asi špatný odkaz

Všiml jsem si, že u odkazu na stažení IIS Express máte stejný odkaza jako u SQL Server Express.

Jinak děkuji, že jste se pustil do takového seriálu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Dobrý den,

odkaz jsem opravil. Děkuji za upozornění a podporu. Dokončuji další dva díly (3) a (4). Očekávám, že o víkendu je dokončím.

MB

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

ASP NET MVC

Těším se na pokračování, hlavně vydržet!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Architektura

Super nápad. Zajímavé by bylo věnovat se MVC + IoC/DI, Unit of Work, Repository, EF, rozdělení na BLL a DAL.

Jinak super článek.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zdravíčko,

zareaguji přímo na váš komentář a odpovídám : ANO, budeme se tomu všemu věnovat :-)

Budeme se věnovat jak věcem, co se týkají architektury - MVC, IOC/DI, UOW, DAL, BL, SOC, SOLID, ADM vs RDM,..

tak dalším, například využívání .NETu na nejrůznější generování kódu z frontendu, tedy:

Generování TypeScriptu, JavaScriptu, Angularu atd.

Bude toho opravdu hodně a chystám se i využívat hojně předpřipravených solution a především vlastního NuGet repozitáře pro lepší použití.

Ještě to ale nějakou dobu potrvá, není to málo práce a v tomto týdnu nevím kam dříve, rozhodně ale hodlám s elánem pokračovat :-) Děkuji za přízeň.

MB

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Paráda,

na seriál tohoto typu v českém jazyce jsem ještě nenarazil, takže se moc těším na další díly. Konečně se někdo rozhodl to pojmout komplexně a enterprise. Hodně zdaru do dalších dílů.

Vlastimil Almer

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jop

Bezva. Vypadá to dobře ! Jen tak dál.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Dobrý den

Doufám, že tento seriál taky neskončí po třech, čtyřech dílech, jak tomu bývá zvykem. Do MVC se snažím proniknout, jen je tam spousta "ale". Zatím používám WebForms a nemám si na co stěžovat. Nicméně bych se rád MVC naučil, abych to mohl používat... Takže držím palce, ať Vám to nadšení vydrží...

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Zdravím, děkuji za reakci.

O jaké "ALE" jde? mohu se jim v článcích také věnovat.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Tím "ale" myslím absenci formulářových prvků GridView apod., plnění různých komponent z DB za běhu, atd...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A jedná se u Vás o to, že prozatím moc nevíte jak na to, nebo se vám to zdá obtížné? Jinak, budu se tomu věnovat..

Konkrétně, u plnění za běhu různých prvků stránky budou přístupy následující:

Vanilla (nejhorší, nutný refresh celé stránky), MVC @ajax - reload pouze části stránky, což je velmi jednoduché na použití a poměrně dostačující, Javascriptové gridy + ajax a nakonec AngularJS a MVC.

Budu dělat vše proto, abych vás nezklamal. Diskuze pro případné dotazy, bude jistě také k dispozici.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Oproti WebForms je to dosti pracné a v podstatě všechno, co jsem chtěl dělat jsem zdlouhavě hledal na internetu, takže jsem to záhy opustil a zůstal u WebForms.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Záleží asi přístup od přístupu, pokud bych měl říct asi ten nejjednodušší, tak se tam plácne třeba komerční Kendo UI, vloží se tam 3 řádky javascriptu a v AKCI u controlleru se dá jedna řádka na IQueryable a máte hotový kompletní grid, včetně efektivního pagingu, sortění, vyhledávání atp.

Přesto s vámi souhlasím, že MVC nemá snad v sobě ani zabudováno nic jako @Html.MagicGrid() a jsem za to popravdě velmi rád.

WebForms vs MVC přináší trošku rozdílné přístupy a každé má svoje výhody / nevýhody - které se nejčastěji vyskytují podle vaší pozice ve vývojářském týmu. Pokud jste tedy čistý .NETář a zvyklý pracovat sám, budou vám některé věci v MVC minimálně ze začátku chybět. Pokud jste ale například designer, nebo frontend developer, budete naopak šílet z komponentového přístupu webforms.

Obecně například pro gridy mám nejraději přístup nějaká JS komponenta na frontendu (mám moc rád Kendo UI) a OData na backendu, ale vystačíte si i bohatě s běžným MVC controllerem, který servíruje IQueryable..

Je to tedy spíše opravdu o nějakém "foundationu" než o technologii v tomto případě. Vydržte prosím, budu se tomu věnovat.

Prozatím zasílám ukázku, jak to třeba pak může vypadat v tom ASP MVC + Kendo:

http://docs.telerik.com/kendo-ui/aspnet-...

Tedy Controller:

public ActionResult Products_Read([DataSourceRequest]DataSourceRequest request)
{
    using (var northwind = new NorthwindEntities())
    {
        IQueryable<Product> products = northwind.Products;
        DataSourceResult result = products.ToDataSourceResult(request);
    }
}

A view něco obdobného:

@(Html.Kendo().Grid<KendoGridAjaxBinding.Models.Product>()
      .Name("grid")
      .DataSource(dataSource => dataSource // Configure the grid data source
          .Ajax() // Specify that ajax binding is used
          .Read(read => read.Action("Products_Read", "Home")) // Set the action method which will return the data in JSON format
       )
      .Columns(columns =>
      {
          // Create a column bound to the ProductID property
          columns.Bound(product => product.ProductID);
          // Create a column bound to the ProductName property
          columns.Bound(product => product.ProductName);
          // Create a column bound to the UnitsInStock property
          columns.Bound(product => product.UnitsInStock);
      })
      .Pageable() // Enable paging
      .Sortable() // Enable sorting
)

Není nutné toto generovat pomocí HTML helperu - fluent API, jde to i například pomocí čistého JS a JSONu pro nastavení.

Osobně se budu snažit právě většině helperu vyhýbat, jelikož je to pak takový poměrně omezující blackbox, jako u webforms.

S pozdravem,

MB

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

S chutí dotoho !

Hezký den.

Něco o MVC tady dle mého názoru dost chybí a jsem rád, že se našel člověk, který se do toho s ochotou pustí. Jen si myslím, že některá zmiňovaná témata s MVC tak úplně nesouvisí nebo jen velmi okrajově (IoC, linq, T4). Nicméně nechám se překvapit a budu se těšit na další články :).

R.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Dobrý den,

vskutku, máte zcela pravdu. Některá témata přímo s MVC nesouvisí, seriál ale není a nebude čistě o MVC, půjde o seriál od základů až po enterprise řešení využívající ASP NET MVC, WebAPI atd. Jedním z hlavních cílů je tedy představit největší sílu celé platformy a to jak pro člověka, který chce opravdu prvoplánově začít s vývojem na .NET, tak pro vývojáře z jiných platforem, aby měli možnost porovnání.

ASP MVC je tedy zde zmíněno pouze jako hlavní stavební kámen.

Děkuji za komentář a přeji hezký zbytek večera

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Insaniator's comment

Dobrý úvod, těším se na další díl. Let's rock!

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback