mvc 4 test

Tags:    asp.net mvc

<< < 12 > >>
Hejsa

Jeg forsøger at lære lidt mere omkring MVC og har derfor kastet mig over MVC 4. Syntaksen er lidt anderledes end det jeg kan finde om MVC 3 og bruger "@" langt mere end "<%" så kan være svært at finde rette og brugbare synes jeg, men ellers meget smart.
Det er lidt anderledes end jeg er vant til og også meget anderledes end det jeg har prøvet fra webforms (ASP.NET C#).
Indtil videre har jeg lavet mig selv en menu til at navigere, men ikke selve siderne endnu.

Det jeg forsøger nu at lave er at lave en menu der viser den aktive side, og ville gerne forsøge at holde det i rent c#, ASP.NET og MVC så vidt muligt.
Så kan jeg altid begynde at forbedre mine evner til javascript senere, men til at starte med vil jeg gerne holde mig til en ting af gangen.
Hvis jeg har:
LINK1
LINK2
LINK3
LINK4

Så vil jeg gerne have at LINK1 har en anden class sat i sit actionlink eller a-tag, således at det bliver fremhævet at det er dette der er valgt. Og såldes når man trykker på LINK2 så markeres denne og de andre bliver almindelige.

Min umiddelbare tanke er at holde en variabel der siger hvilket link der er trykket på.
Således at når man trykker på linket aktiveres min server-side og modtager dermed denne post-back hvor jeg kan sætte id'et på den valgte. Og i hver link kan jeg så lave et inline-script der ser om id'et på dette link er lig med navnet i variablen og ud fra dette sætter om der skal bruges klasse1 eller 2 (aktive).

Det hele laves i _layout.cshtml og har lidt kodestumper her:
Fold kodeboks ind/udCSharp kode 

Dog kan jeg ikke få den til at gøre det rigtigt da den altid blot sætter menupunkt 2 til det aktive efter at den første del sætter den activeClass & linkActiveClass.
Håber det er nogenlunde forståeligt og nogen har en ide om hvordan det kan løses.

Desværre har jeg ikke noget sted at ligge det og vise jer.



12 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Hvordan ville du have løst det hvis det var WebForms? Jeg tror ikke der er så meget forskel.

Jeg plejer at lave det i ViewBag objeket og så have din controller metode sætte en værdi du i din side kan kigge på og så sætte en klasse ud fra det.



Der er ikke meget C# eller ASP.NET i det du viser der?



EDIT:
1) Jeg har opdaget noget jeg ikke forstår.
Da jeg forsøgte at få lavet et link med onclick-attribut på havde jeg lavet en anden løsning end den som der var lavet standart.
Standart løsning der fungerer:
Fold kodeboks ind/udCSharp kode 


Den anden som ikke fungerer, men som jeg ikke kan finde ud af hvorfor ikke fungerer. Kan se at ActionName og ControllerName er samme sted og samme værdier, men alligevel fungerer den ikke.
Fold kodeboks ind/udCSharp kode 


Nogen der kan hjælpe mig med det?

2) NEDENSTÅENDE SPØRGSMÅL HAR JEG SELV BESVARET!
LØSNING:
Fold kodeboks ind/udCSharp kode 

Samme for alle andre der bruges. Tror jeg ved så småt at forstå det her MVC noget! Fed følelse!

>>>>>>>
Nu er dette sat i min Index()-metode i min HomeController (bruges til link1).
Fold kodeboks ind/udCSharp kode 

Og det samme er sat i Index()-metoden i min HelloWorldController (bruges i link2)
Fold kodeboks ind/udCSharp kode 

Hvis jeg så fortsat gerne vil blive ved med at have at mine menu'er skal blive ved med at være markeret når jeg fortsætter med at lave nye metoder og views skal jeg blive ved med at huske på at sætte dette i min viewbag eller i hver metode med et ActionResult kalde en metode der sætter disse værdier.
Kan det virkelig passe det skal laves så dumt og besværligt? Kan man ikk gøre noget så jeg ved at hver gang en metode kaldes i en Controller så sættes disse værdier automatisk ligesom man kan gøre i en constructor til en normal klasse?


-----------------------------------------
Der er ikke meget C# eller ASP.NET i det du viser der?
Hejsa Brian.
Nu er det kun designet jeg er ved at lave så der er ikke meget funktionalitet og dermed heller ikke meget ASP.NET eller C# at vise, men hvis du ser godt nok efter kan det godt ses.
Det hele er ihvertfald lavet i C# og MVC 4 fra Visual Studio 2011 Beta :)

Hvordan ville du have løst det hvis det var WebForms? Jeg tror ikke der er så meget forskel.

Jeg plejer at lave det i ViewBag objeket og så have din controller metode sætte en værdi du i din side kan kigge på og så sætte en klasse ud fra det.
Tak Brian.
Hvis jeg skulle lave det i webforms ville jeg formegentligt have en masterpage at jeg ville kunne modtage alle events i og identificere hvilket link der er blevet klikket på.
Jeg tror jeg har fået det løst nu ved at lave det i ViewBag som du sagde, så mange tak :)

Jeg har indtil videre brugt det eksempel der følger med og som man starter op på, og her ligger det hele i HomeController. Og det jeg så har gjort er at i Index() har skrevet klasse-navnet ind i ViewBag i en property speciel designet til det første link, og vil så også blive nødt til det til det næste link og det 4.
3) Der er vel en smartere og mere effektiv måde at lave det på? Synes selv det virker lidt langhåret ikke at lave en mere generel og smuk metode. Der må nogle af jer hajer kunne hjælpe mig lidt her til at lave noget der passer lidt til "the mvc way" i guess? :P



Indlæg senest redigeret d. 11.05.2012 23:31 af Bruger #17215

Kan det virkelig passe det skal laves så dumt og besværligt? Kan man ikk gøre noget så jeg ved at hver gang en metode kaldes i en Controller så sættes disse værdier automatisk ligesom man kan gøre i en constructor til en normal klasse?


Du kan jo altid sætte noget globalt ved at gøre det i constructor eller nedarve fra controller. Men spørgsmålet er nok nærmere om det giver mening!

Du skal huske på at det ikke er for alle metoder du vil sætte den aktiv, kun for de metoder der returnerer et View. Du kan jo sagtens have masser af andre metoder (specielt når du skal i gang med JQuery) som ikke skal sætte den, fordi de ikke returnerer en side.



Du kan jo altid sætte noget globalt ved at gøre det i constructor eller nedarve fra controller. Men spørgsmålet er nok nærmere om det giver mening!

Du skal huske på at det ikke er for alle metoder du vil sætte den aktiv, kun for de metoder der returnerer et View. Du kan jo sagtens have masser af andre metoder (specielt når du skal i gang med JQuery) som ikke skal sætte den, fordi de ikke returnerer en side.
Hejsa Brian
Jeg vil lige sikre mig vi ikke snakker forbi hinanden..

Jeg har nu lavet flere forskellige Controllere til hver gruppe-side som skal have forskellige undersider.
Fx Anmeldelser, Ønskeseddel, Blog, etc.
og så til hver gruppe / kategori kan man så have forskellige underlinks.

Så hvis jeg på hver Controller har en constructor der sætter top-menu-punktet (Anmeldelser) til at være aktiv og markeret så kaldes den vel en gang hver gang en metode på Controlleren kaldes? For det fungerer vel også sådan i MVC at hver gang serveren modtager et request så skal alting opbygges igen og laves på ny? Og når det response så er leveret så opbevares ingen objektstrukturer eller noget på serveren?

Jeg kan godt se at nogle gange hvis der kaldes en metode på Controlleren som leverer et JSON response / string, så vil det vel egentligt ikke være nødvendigt fordi en anden metode vil være kaldt som skal returnere et view inden man kommer så langt, men jeg er blot mere nervøs for at jeg ellers vil glemme at sætte dette på nye metoder hvor at hvis jeg gør det i constructoren så jeg sikker på det at den valgte katergori (anmeldelser etc) altid vises som aktiv når andre metoder eller undersider kaldes så vises det stadig at det er denne kategori der er aktiv.



Vi snakker ikke forbi hinanen :-)
Jeg mener endda de er en metode man kan overstyre på en controller der så bliver kørt hver gang der requestes noget, hæng lige på jeg kigger lige i noget kode :-)
...
Tilbage :-)
Her er lidt kode, jeg laver selv en controller som alle nedarver fra, (det er til sprogstyring) og den har en metode jeg kan overstyre som kalder hver gang en action kaldes:

Fold kodeboks ind/udCSharp kode 




MinSide.cshtml:

<ul>
<li>
@Ajax.ActionLink("Link1","<Link1ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
<li>
@Ajax.ActionLink("Link2","<Link2ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
<li>
@Ajax.ActionLink("Link3","<Link3ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
</ul>

<div id="ReplaceMe"/>






MinSide.cshtml:

<ul>
<li>
@Ajax.ActionLink("Link1","<Link1ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
<li>
@Ajax.ActionLink("Link2","<Link2ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
<li>
@Ajax.ActionLink("Link3","<Link3ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
})
</Li>
</ul>

<div id="ReplaceMe"/>




Hvordan vil du lave SEO i denne løsning?



.
.
<li class="linkclass" id = "linkli2">
@Ajax.ActionLink("Link2","<Link2ControlerMethod>",new AjaxOptions
{
UpdateTargetId = "ReplaceMe",
InsertionMode = InsertionMode.Replace,
HttpMethod = "GET",
OnSuccess = "$('.linkclass').<doyourdisablething>(); $('#linkli2').<doyourenablething>();"
})
.
.



Det jeg mener er, når siden ikke skifter (url) så har du altid den samme side, hvordan vil du så fortælle google hvordan den skal indeksere din side. Jeg er ikke i tvivl om at det virker, det virker bare mystisk ud fra et SEO mæssigt synspunkt. Fx. vil du så kun have een side i din løsning?



<< < 12 > >>
t