ASP.NET MVC "panel"

Tags:    asp.net mvc

Hejsa

Jeg er ved at få noget mere info og erfaring med ASP.NET MVC, men der er en ting jeg nu er stødt på som jeg ikke helt kan finde ud af hvordan jeg gør. Det er noget jeg ved hvordan gøres i ASP.NET Webforms og vil nu prøve at lave noget lignende i ASP.NET MVC.

Hvis jeg har pakket noget ind i et panel kan jeg sige det ikke skal vises og kommer dermed ikke med ud på siden. Når man så trykker på en knap returneres siden med panelet i og wupti der er nu kommet ny info på siden.

Hvordan gør jeg lige det i MVC?
Det er vigtigt for mig at det det ikke er på siden men skjules fordi det er kontaktinformation, så for at undgå at disse information udnyttes af crawlers til spam så skal man klikke på vis mere før siden returneres med dem på.


Har løst det ved at lave et AJAX request til min controller der leverer JSON data tilbage og lader jQuery stå for det.



Indlæg senest redigeret d. 02.09.2012 18:52 af Bruger #17215
4 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Du skal huske på at ASP.NET MVC er "back to basics" - det er helt tilbage til hvordan en browser og HTML fungerer. ASP.NET WebForms er et kunstigt lag ovenpå HTML/HTTP hvor man har forsøgt at bevare en tilstand ved at have viewstate osv.

En browser kan i bund og grund KUN vise HTML. Det betyder at den får sit HTML fra WebServeren. Paneler i WebForms er også bare "div" tags - men WebForms har noget kontekst der sendes frem og tilbage som afgører hvad du har klikket på etc.

Personligt kan jeg bedre lide MVC modellen, da den er meget mere ren og der ikke er alt muligt snask i HTML'en men at det er serveren (din controller) der bestemmer hvad der skal vises, og så din UI (dit View) der præsenterer det.

For at lave et panel i MVC kan du jo gøre som du har gjort i dette tilfælde, alternativt kan du gøre det med JQuery hvor du har et antal "div" tags du så med knapper viser/skjuler (JQuery kommandoen "toggle()") - så fungerer det på samme måde som et "multiview" i WebForms - det vil sige at du ikke har et postback. Hvis du vil lade controlleren om at bestemme hvad der skal vises, kan det gøres på to måder:

1: Du kan fra din controller sende en variabel over der bestemmer om den må vises eller ej, fx.: ViewBag.ShowPanel = true; Ulempen ved dette er at du stadig har dit HTML i din side (det kan læses ved at sige "view Source".
2: Du skal selv returnere dit HTML, eller i det mindste bede forskellige views/custom controls on at rendere sig selv til din HTML stream. Dette mener jeg er meget overkill og introducerer meget mere arbejde end der er nødvendig.

Hvis kommandoen skal komme fra dit View, fx, fra en knap eller et "ActionLink" kan du lave en ny Route, der kan tage en værdi med, der bestemmer om det skal vises eller ej - det kan fungere, men jeg synes det virker "omvendt" at have UI'ens logik sendt ned til Controlleren.




Jepsen, det er også den "rigtige" måde at gøre det på, når du ikke vil have dit markup på siden, sålees du blot via javascript skjuler/viser dit "div" tag.

Måden at løse det på er også mere elegant end den måde webforms gør det på. Den laver en fuld postback, og får fuld (nyt) html med tilbage.



Men jeg kom til at tænke på..
Der må da være en lignende måde at gøre det på i MVC hvis man vil lave en side der kan fungere uden javascript?

Skal man så lave en action med input som definerer om man vil have det vist eller ej og så i linket lave et kald til "/controller/action/true" for at man således kan fortælle viewet at man nu ved at man vil have det vist?
Således at dit input som standart vil være false hvis intet er defineret, og dermed give det tilbage når man kalder index(), og så ved "action/true" (true er input variabel) for at fortælle viewet det nu skal vises og ellers vil viewet få standart-værdien false?



@Brian
Jeg giver dig ret i at det er forkert at UI'en logik skal sendes ned til controlleren, men min problematik er at da det er data som mail og lignende vil jeg gerne (så vidt muligt) sikre mig at data ikke er i HTML'en i stedet for at skjule den (toggle via jQuery).

Ved at fjerne jQuery og javascript for at have en side der altid fungerer så bliver jeg jo nødt til at lade min controller bestemme hvad der skal vises.
Og vil sige at den pæneste løsning for mig vil være det med viewbag, for jeg kan jo så i mit view lade være med at outputte dette stykke HTML hvis den ikke er true og vil dermed ikke være i min HTML (ikke som usynlig).

Derudover så har jeg det ligesom dig fordi at MVC der kan man helt selv styre hvad der kommer ud og det giver ikke "glitches" som man nogle gange kan opleve i webforms. Fx oplevede jeg nogle underlige fejl da jeg skulle lave et billede om til en knap og brugte webforms kontroller. Man har fuld kontrol over sin HTML og for mig er det at lave flere forskellige niveauer også langt bedre i MVC.
Jeg glemmer aldrig da jeg skulle lave nestede repeatere i webforms. Hver kategori skulle vises og så under denne skulle der så udskrives de elementer under denne kategori.
Det er bare meget nemmere i MVC fordi du kan lave noget simpelt læsbar kode, hvor med nestede repeaters blev det pludseligt meget uklart hvad der sker, hvorfor etc. og specielt hvis man ikke selv har lavet det eller bare jeg skulle rette noget 6 måneder efter.
Derfor jeg ser mere på MVC og langsomt lærer mere og mere og jo mere jeg lærer jo mere glad bliver jeg for det.


Nu "mangler jeg bare" (farlige sidste ord) at finde en måde at jeg kan få et link til at udføre javascript hvis det er enabled og så ikke gøre mere, og hvis ikke så udføre et postback til en ny route som gør at mit view returnerer samme side med noget mere HTML (det "panel" eller HTML der ikke var der tidligere).

Se mere her: http://www.udvikleren.dk/forum/38722/link-udfoere-javascript/#msg185366

Hvor dum har jeg lov at være!
Et link til en route som giver et postback, og hvis javascript er understøttet så er der et script der replacer adressen med javascript-void således at der udføres javascript og ingen postback.



Indlæg senest redigeret d. 03.09.2012 15:38 af Bruger #17215
t