ASP.NET MVC Input typer

Tags:    asp.net mvc

Hejsa udviklere

Hvordan kan man lige sætte en smart inputtype til at indsætte i modellen?
Jeg har lavet en model med DateTime, men "smart" som MVC er så laver den:
Fold kodeboks ind/udCSharp kode 


Hvordan får jeg lige inputfeltet til at være date?

Det jeg selv synes var så fedt ved MVC var at jeg kunne lave alting selv som jeg ville, og havde åbne muligheder og ikke at ASP.NET skulle lave alting "smart" for mig på en måde jeg ikke synes var passende.
Kan man ikke lave sit eget inputfelt og specificere at indholdet af denne skal bruges som input til Model.StartDato?



Indlæg senest redigeret d. 22.04.2013 18:38 af Bruger #17215
5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Tænk, jeg anede ikke engang at der var et HTML date element %)

Dit scenarie er en anelse mere komplekst, end det der er i MVC som default. Modelbinderen skulle fint kunne læse en værdi i et tekstfelt fra jQuery timepickeren som en datetime, så det er kun HTML helperen der skal udvides.

Ved at lave en extension til HTML helperen, kan du få den til at gøre det du vil. Dog skal du kalde en anden metode en EditorFor.

Afprøvede lige det jeg skrev du skulle, med en DataType.Date, og det giver en input="date":

Fold kodeboks ind/udCSharp kode 


edit: Her er source til testprojektet. Controlleren hedder Test, så du kan finde testsiden på host/Test.

Koden finder du her

Var måske ikke helt klar i mit første indlæg - min telefon ringede i mens jeg prøvede at finde navnet på DataType attributten, min gamle bedstemor ville invitere på fødselsdagskaffe.



Indlæg senest redigeret d. 22.04.2013 21:47 af Bruger #16372
Du kan gøre det på det to måder:

1. Vær mere specifik i dit view. F.eks. en checkbox:
Fold kodeboks ind/udCSharp kode 


2. Definer hvad inputtyper der skal vises i din modelklasse ved hjælp af attributter. Nedenstående er taget fra denne side.

Fold kodeboks ind/udCSharp kode 


Det andet eksempel viser også hvordan man opsætte valideringsbetingelser..



@Nicky
Tak for hjælpen, men var mere ment som at det den generer er et tekstfelt.
Min type er Datetime, som den giver en input type="text" for med formattet 01/01/0001 00:00:00 som standart værdi, som endda giver en valideringsfejl.
Jeg havde forventet den i det mindste ville kunne give input type="date" som vil give det samme i alle browsere undtagen Safari som faktisk kan rendere en popup for dig, og så at browseren selv validerer inputtet.

Mit problem er så at jeg ikke ved hvordan jeg kan erstatte
Fold kodeboks ind/udCSharp kode 

med
Fold kodeboks ind/udHTML kode 

og så får værdien af det indtastede i StartDato over til min controller på en smart måde?




@Nicky
Tak for hjælpen, men når jeg poster det tilbage så giver valideringen stadig fejl.
"01-01-2001" giver min fejlmeddelelse ved valideringen "The field Start dato must be a date.".
Det viser sig at det er fordi at formattet ikke er defineret og så laver runtime den automatisk til dansk tidsformat, men når den skal valideres så skal den stå som amerikansk.
Så "01-01-2001" det den sætter som standart værdi, men skal ændres 2001-01-01 for ikke at få valideringsfejlen.
Så har læst lidt om at man kan definere formattet og håber det kan hjælpe på det så formattet kan blive valideret.

UPDATE
Tilføjede
Thread.CurrentThread.CurrentUICulture = new CultureInfo("da-DK");
til global.asax
og i min model tilføjede jeg
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
Så laver den automatisk formattet om til 01-01-0001 for dig som ikke giver valideringsfejl.
Så nu er next step nogle min og max-værdier - altså at man ikke kan lave en dato der er "for lille" og heller ikke en der er større end dags dato.

Tak for hjælpen Nicky!



Indlæg senest redigeret d. 22.04.2013 23:11 af Bruger #17215
MVC kører som standard efter browserens sprogindstillinger.

Du kan ændre sproget/kulturen, ved at ændre det for den tråd som forespørgslen bliver afviklet af.

Fold kodeboks ind/udCSharp kode 


Tilføj ovenstående metode i Global.asax og ændre lang variablen til en string som beskrevet i koden. Dette er fra MVC4. Mener ikke metoden hedder det samme i MVC3 og tidligere.

edit: Dette skal dub selvfølgelig kun gøre, hvis hele webapplikationen skal være engelsk!

edit v2: Godt at se du fik det til at virke :)



Indlæg senest redigeret d. 22.04.2013 23:15 af Bruger #16372
t