Skip to main content

Posts

Showing posts with the label MVC 3

Post event - Intâlnire CodeCamp la Cluj-Napoca - 24 martie 2012

Ieri, 24 martie 2012, a avut loc un nou eveniment de primavara pentru comunitate. Acesta a fost organizat de catre CodeCamp in Cluj-Napoca. Fata de alte evenimente CodeCamp pe care le-am organizat in Cluj, acesta a fost cel mare de pana acuma (peste 115 persoane). Speram ca si in viitor sa avem acelasi numar de participant. Pe aceasta cale vreau sa le multumesc tuturor pentru participare. Au fost 5 prezentari foarte interesante despre diferite subiecte. Mihai Nadăș - Globally distributed DNS service with Windows Azure's Traffic Manager Florin Coros - Good Unit Tests Ask For Quality Code Radu Vunvulea - ASP.NET MVC 3 - Bad practices Levente Veres - How to create easily Workflows and present with Visio in SharePoint 2010 Mihai Tataran -     Building elastic, autoscalable solutions with Windows Azure Daca in viitor doriti sa tineti prezentari in Cluj-Napoca si nu numai, va rog sa ma contactati.   As vrea sa le multumesc sponsoriilor ca ne-au ajutat sa organizam aces...

MVC - What a view should never contain( part 1)

Part 2 Suntem intr-o aplicatie MVC. Un model poate sa fie folosit de 1 sau mai multe viewuri. Intrebarea de unde a pornit totul este Ce ar trebuii sa contina un view? Daca ne luam dupa carte: Un View trebuie sa contina codul prin intermediul caruia se genereaza interfara grafica asteptata. Viewul se ocupa cu partea de render la date pentru a afisa modelul corespunzator. In acest caz ce este un Model? Raspunsul scurt si sec pe care il primesc mereu este: o clasa care contine datele ce trebuie afisate in view. Citisem anul trecut ca un model poate sa fie reprezentat de un web service, de un repository sau de catre un alt bussines layer. Aceasta afirmatie este falsa. Da sursa datelor poate sa fie un web-service, un repository sau un bussines layer, dar datele care o sa fie afisate tot ca o colectie de la 1 la n de de obiecte pe care le primim. Indifierent ca este o colectie de stringuri, o clasa, sau un singur string. Aceste date pot sa fie modelate ca si o clasa. Daca ne intoarcem la pri...

MVC 3 - Handling 404 errors

Intr-un post anterior am promis ca o sa revin cu cativa pasi ce trebuie facuti pentru a putea face handling corect la o aplicatie ASP.NET MVC 3. Mai jos o sa gasiti cei 3 pasi care trebuie facuti pentru a face handling la erorile de tip 404 cat mai bine, fara sa avem surprize neplacute cand aplicatia este deja in productie. Exista mai multe variante. Varianta aleasa de mine nu necesita existenta sau modificarea unui base controller. 1. Pentru toate erorile care apar in sistem avem nevoie de un loc comun Toate erorile trebuie sa fie controlate dintr-un loc comun. In cazul in care vrem sa vedem la ce erori se face handling sau care este modalitatea prin care se face handling, ca sa nu cautam prin controale, cel mai usor este sa ne facem un controller care se ocupa doar cu acest lucru. public class ErrorController { public ActionResult Http404(string url) { Response.StatusCode = (int)HttpStatusCode.NotFound; var model = new ErrorViewModel(); model.Reque...

MVC 3 - Error handling

Cat de mult va place ecranul galben intr-o aplicatie web? Cred ca e la fel de faimos ca si ecranul albastru din Windows. Mai este numit si YSOD – Yellow Screen Of Death. Acest ecran nu ar trebuii sa apara niciodata in productie. Mai jos o sa vorbim despre doua modalitati cum putem sa evitam acest ecran. MVC 3 ne aduce o functionalitate build-in pentru handling la erori. Atributul HandleErrorAttribute se ocupa de acest lucru pentru noi si face o treaba foarte bine atata timp cat este folosit corespunzator. Putem sa il folosim in doua metode. O metoda este sa decoram controlerele sau actiniile cu acest atribut. In acest mod, orice eroare care apare in controlerul/actiunea noastra o sa fie prinsa de catre MVC 3. O alta variant este sa adaugam in lista de GlobalFilter si atributul nostru – acest lucru se face in Global.asax.cs - Application_Start . In acest fel nu are importanta de unde vine eroare, o sa fie facut handle la eroare de catre MVC 3. [HandleError] public class HelpCon...

Detecting Session Timeouts

Durata de viata a unei sesiune se poate seta din fisierul de configurare. Valoarea minima pe care o poate avea este 1 minut: <sessionState   mode = " InProc "   timeout = "1" / > Cand setati durata de viata la sesiune trebuie sa avegi grija ca IIS, by default face recyle la AppPool odata la 120 de minute. Ambele valori trebuie modificate daca doriti ca durata de viata a sesiunii sa fie mai mare. Dintr-o aplicatie ASP.NET, folosid metoda Session_End din Global.asax nu o sa puteti prinde mereu acest eveniment. Pentru mai multe detalii: http://vunvulearadu.blogspot.com/2011/11/when-sessionend-is-called.html. Pentru a putea detecta daca o sesiune este noua putem sa verificam valoarea propietatii Session.IsNewSession.Aceasta propietate este TRUE cand sesiune este noua. Folosit aceasta propietate pe ASP.NET MVC3 ne putem declara un action filter prin intermediul caruia sa detectam daca sesiunea a expirat. public   class   Sessi1onExpireFilterAttribute ...

Html.ActionLink with image

Problema: Se cere ca intr-o aplicatie MVC 3 sa afisam un link, dar in loc de text sa apara o imagine. Solutie: Cel mai simplu lucru este sa ne definim o clasa CSS care afiseaza o imagine in background. a.HelpLink { background: url(../Images/Icons/Help.gif) no-repeat top left; display: block; width: 100px; height: 100px; text-indent: -9999; } Prin intermediul ultimei valori ascundem link-ul textului. Ca sa ne definim link-ul trebuie mai este nevoie doar sa specificam in ActionLink ce clasa CSS sa fie folosita: <%= Html.ActionLink("Help", "HelpAction", null, new { @class="HelpLink" }) %> Enjoy!

MVC 3 - Custom view load based on the source of the request

Pornim de la următoarea problema: Se da o aplicație ASP MVC 3. Se dorește sa încarce view-uri custom pentru fiecare tip de device care o accesează. De exemplu în cazul în care request-ul vine de la un iPhone sau un Windows Phone 7 atunci view-urile care se încarcă o sa fie diferite. MVC suporta deja crearea unei versiuni de view pentru mobile device, dar acest lucru nu o sa ne fie de ajuns. In funcție de rezoluție sau de brower o sa dorim sa încărcam view-uri total diferite. Informațiile despre ce tip de device accesează resursa le putem găsii in user-agent. Proprietatea user agent-ul se poate găsii în următoarea locație HttpContext.Request.UserAgent Aceasta valoare o sa fie de tip string, unde este necesar sa cautam manual valoarea pe noi o cautam. Pentru IPhone user agent-ul o sa aibe valoarea: Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 Iar un request de la un Windows Phone 7 o sa aibe următoarea valoare:...

How to disable validation for a submit button

Pornim de la o aplicate MVC 3 pe care avem o forma cu mai multe controale de tip input-submit. Se doreste ca unul sau mai multe butoane care fac submit sa nu facă și validarea modelului client-side. <form ... > .... <input id="bSave" type="submit" value="Save" /> <input id="bAddToy" type="submit" value="Add toy" /> </form> O solutie care pare la indemana este ca la al doilea buton din exemplu sa fie transformat într-un link (ancora). Din CSS poate sa fie făcut sa arate exact ca un buton de input iar la click poate sa apeleze un jQuery care apelează acțiunea dorita făcînd submit și la model. O a doua soluție găsita, care mi s-a părut extrem de simpla și care rezolva aceasta problema este adăugarea class="cancel" la butonul de input la care dorim sa nu facem validarea: <input id="bAddToy" type="submit" value="Add toy" class="cancel" /> V...

MVC 3 - UrlParameter.Optional

Zilele astea am inceput sa ma uit peste MVC 3 si sa vad ce a adus nou. S-a scris foarte mult, nu am de gand sa desfac firul in patru cu fiecare lucru aparut in MVC 3. In schimb vreau sa va spun peste ce problema am dat. In MVC 2 cand se declara un map route - unul sau mai multi parametrii pot sa fie optionali. In acest caz cand se face apelul unei actiuni, acesti parametri pot sa lipseasca. De exemplu putem sa avem urmatoarea mapare: routes.MapRoute( "Drive", "drive/go/strada/numar" controller = "Drive", new { action = "Go", numar = UrlParameter.Optional bloc = UrlParameter.Optional }); Antetul actiuni ar avea forma: public ActionResult Go(string strada, int? numar,int? bloc); Apelul spre aceste acțiuni am dorii sa fie de forma: http://localhost/drive/go?strada=Dunarii http://localhost/drive/go/Dunarii/10/5 http://localhost/drive/go/Dunarii O sa observam ca pentru prima varianta http://localhost/...