Toon posts:

MVC [httpPost]

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Ik probeer MVC te leren met een heel simpele oefening nl. Hangman.

Momenteel heb ik een view die hangman toont, gebaseerd om model Hangman.
C#:
1
2
3
4
5
6
7
8
9
10
 public class Hangman
    {
        public int Stap { get; set; }
        public string TeRadenWoord { get; set; }
        public char[] GeradenWoord { get; set; }
        public bool Gedaan { get; set; }
        public bool Gewonnen { get; set;}
        public String Source { get; set; }
.....
}

De bedoeling is dat ik , als ik bijv op letter 'e' klik, de methode h.doegok (letter) uitvoer,
Mijn model verandert dan, en aan de hand van mijn aangepast model wil ik opnieuw zelfde view tonen.

Het probleem is: in de [httpPost] aan mijn huidige klasse hangman geraken. (via mijn view).


Voorlopig ziet mijn view er uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@model WebHangman.Hangman
....
@using (Html.BeginForm()){
<img id="img" src="@Model.Source" alt ="" />
<div >
            stap: @Model.Stap 

             <br />
            Geraden :  @Model.GeradenWoord
             <br />
            Boodschap :
             <br />
        </div>
...

En onderaan de waarden die mijn huidige klasse zouden moeten teruggeven aan mijn controller:
code:
1
2
3
4
           @Html.HiddenFor(model => model.TeRadenWoord)
            @Html.HiddenFor(model=>model.Source)
            @Html.HiddenFor(model=>model.Stap)
            @Html.HiddenFor(model => model.GeradenWoord)


En dit is mijn controller
C#:
1
2
3
4
5
6
7
8
 [HttpPost]
 public ActionResult Index(int Stap, String TeRadenWoord, String GeradenWoord, String Source)
        {
            Hangman g  = new Hangman(Stap, TeRadenWoord, GeradenWoord, Source);
            g.doeGok('x');
           
            return View(g);
        }


Helaas krijg ik steeds de zelfde inputparameters binnen.
Bij eerste submit: model.stap wordt ontvangen als 0, verandert naar 1 door de g.doegok(), en stuurt die terug naar de view. Dus mijn view na mijn eerste submit is correct.
Maar bij een volgende submit ontvangt de controller opnieuw dezelfde inputparameters. Stap is bijvoorbeeld terug 0. Hoewel Model.stap op mijn view duidelijk 1 is.


Iemand enig idee hoe dit komt?

[ Voor 1% gewijzigd door RobIII op 10-09-2011 18:59 . Reden: Code tags toegevoegd ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je code post, gebruik dan code tags a.u.b.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10:35
Waarschijnlijk gaat de binding van je model verkeerd. In plaats van losse parameters zet in je controller method eens gewoon:

C#:
1
2
3
4
5
6
7
[HttpPost]
public ActionResult Index(Hangman model)
{
   model.doeGok("x");

return view(model);
}



En bekijk deze post eens m.b.t model binding:

http://odetocode.com/blog...et-mvc-model-binding.aspx

[ Voor 3% gewijzigd door D-Raven op 10-09-2011 19:56 ]


Verwijderd

Verwijderd schreef op zaterdag 10 september 2011 @ 17:35:
code:
1
@Html.HiddenFor(model => model.TeRadenWoord)
Offtopic: Is dat niet een beetje onhandig...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 10 september 2011 @ 20:11:
[...]

Offtopic: Is dat niet een beetje onhandig...
Geen idee.
De bedoeling is de nodige data terug te geven aan de controller.
En de enigste manier (voorlopig) dat ik gezien heb is deze.

Mvc is nog vrij nieuw voor mij.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
D-Raven schreef op zaterdag 10 september 2011 @ 19:56:
Waarschijnlijk gaat de binding van je model verkeerd. In plaats van losse parameters zet in je controller method eens gewoon:

C#:
1
2
3
4
5
6
7
[HttpPost]
public ActionResult Index(Hangman model)
{
   model.doeGok("x");

return view(model);
}



En bekijk deze post eens m.b.t model binding:

http://odetocode.com/blog...et-mvc-model-binding.aspx
Heb ik ook al geprobeerd, maar dan maakt de controller gewone een nieuwe Hangman aan met standaard parameters.
Ik vermoed dat de fout in men view zit, die de form niet goed vult met de nodige data.

Edit:
De fout zit dus effectief in

C#:
1
  @Html.HiddenFor(model => model.Stap)


Want als ik

C#:
1
  <input type ="hidden" id="Stap" name="Stap"  value ="@Model.Stap" />

gebruik, wordt Stap wel upgedate.

Ik kan dus terug verder, maar als iemand weet waarom die .hiddenfor niet werkt, mag hij het altijd laten weten.

[ Voor 19% gewijzigd door Verwijderd op 11-09-2011 13:26 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op zondag 11 september 2011 @ 11:49:
[...]

Geen idee.
De bedoeling is de nodige data terug te geven aan de controller.
En de enigste manier (voorlopig) dat ik gezien heb is deze.

Mvc is nog vrij nieuw voor mij.
Dit zorgt ervoor dat er een html hidden field met de oplossing meegestuurd word. Dat is natuurlijk niet echt handig als je het antwoord geheim wil houden. Je zult het antwoord dus puur op de server moeten houden. Je zou er voor kunnen kiezen om alleen een identifier mee te sturen en aan de hand daarvan het juiste woord op te zoeken in je database/sessie/file/whatever op de server

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op zondag 11 september 2011 @ 13:46:
[...]

Dit zorgt ervoor dat er een html hidden field met de oplossing meegestuurd word. Dat is natuurlijk niet echt handig als je het antwoord geheim wil houden. Je zult het antwoord dus puur op de server moeten houden. Je zou er voor kunnen kiezen om alleen een identifier mee te sturen en aan de hand daarvan het juiste woord op te zoeken in je database/sessie/file/whatever op de server
Dus concreet voor dit voorbeeld.

Elke speler krijgt een instantie van de klasse Hangman.
Naargelang er letters gegokt worden, evolueert die instantie (stap gaat omhoog, Geradenwoord evolueert).

Ipv dus de properties heen en weer te sturen via de form moet ik die instantie zien te bewaren op server.
Dit op een databank zetten is wel heel wat werk voor zo'n kleine oefening.
Zal eens proberen via sessie te bewaren.

Damn, webforms was dan toch heel wat makkelijker, gewoon de instantie in de Viewstate steken en de site werkte.

Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 29-09 16:32
Verwijderd schreef op zondag 11 september 2011 @ 12:15:
Heb ik ook al geprobeerd, maar dan maakt de controller gewone een nieuwe Hangman aan met standaard parameters.
Ik vermoed dat de fout in men view zit, die de form niet goed vult met de nodige data.
Ik zie dat je een constructor gebruikt voor je (view)model op de regel
C#:
1
Hangman g  = new Hangman(Stap, TeRadenWoord, GeradenWoord, Source);

Ik verwacht dat daarom het modelbinden verkeerd gaat. Probeer het eens met een object zonder constructor.

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Net zoals alle form helpers gebruikt Html.HiddenFor altijd de corresponderende waarde uit de POST variablen als deze gevonden wordt. De helper zal enkel de waarde in het (view)model gebruiken als er geen corresponderende POST variable gevonden wordt.

Ga eens met Firebug en/of Fiddler aan de slag en zoek eens uit wat er exact over de lijn heen gestuurd wordt aan request variablen...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op zondag 11 september 2011 @ 13:54:
[...]
Ipv dus de properties heen en weer te sturen via de form moet ik die instantie zien te bewaren op server.
Dit op een databank zetten is wel heel wat werk voor zo'n kleine oefening.
Zal eens proberen via sessie te bewaren.
Nee je "public" properties mag je best over en weer sturen, maar niet je geheime velden, zoals het antwoord. Al zou dat eventueel encrypted nog wel kunnen, maar persoonlijk zou ik daar niet aan beginnen.
Damn, webforms was dan toch heel wat makkelijker, gewoon de instantie in de Viewstate steken en de site werkte.
Ook in webforms was het niet wenselijk om alles maar in de Viewstate te gooien. Je zult bijna altijd het een en ander aan de serverkant bij willen houden.

De ViewState is niet veel meer dan een encrypted serialized collectie die in een hidden field gestopt word.

[ Voor 6% gewijzigd door Woy op 12-09-2011 09:57 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 12 september 2011 @ 09:04:
[...]

Nee je "public" properties mag je best over en weer sturen, maar niet je geheime velden, zoals het antwoord. Al zou dat eventueel encrypted nog wel kunnen, maar persoonlijk zou ik daar niet aan beginnen.

[...]

Ook in webforms was het niet wenselijk om alles maar in de Viewstate te gooien. Je zult bijna altijd het een en ander aan de serverkant bij willen houden.

De ViewState is niet veel meer dan een encrypted serialized collectie die in een hidden field gestopt word.
En bestaat er geen zo'n alternatief voor MVC? ( alternatief voor Viewstate)?
Kan je bijv met de Viewbag geen informatie geencrypteerd terugposten?

Als elke instantie van het model naar een databank moet geschreven worden, dat lijkt toch ook wat overkill, niet?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Woy schreef op maandag 12 september 2011 @ 09:04:
De ViewState is niet veel meer dan een encrypted serialized collectie die in een hidden field gestopt word.
De viewstate is, AFAIK althans, niet eens encrypted hoor; enkel Base64 encoded.
Verwijderd schreef op maandag 12 september 2011 @ 14:09:
Als elke instantie van het model naar een databank moet geschreven worden, dat lijkt toch ook wat overkill, niet?
Je kunt toch gewoon het-te-raden-woord in je sessie knallen? Of denk ik nou zo simpel :?

[ Voor 40% gewijzigd door RobIII op 12-09-2011 14:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 12 september 2011 @ 14:09:
[...]
En bestaat er geen zo'n alternatief voor MVC? ( alternatief voor Viewstate)?
Kan je bijv met de Viewbag geen informatie geencrypteerd terugposten?
Ik weet niet of er een kant en klaar alternatief is, maar een object serializen en het resultaat encrypten is ook weer niet echt rocket science.
Als elke instantie van het model naar een databank moet geschreven worden, dat lijkt toch ook wat overkill, niet?
Ik zeg niet dat je alle objecten naar een database moet schrijven, dat is afhankelijk van je verdere implementatie. Je zou er ook voor kunnen kiezen om het in je Session te stoppen of iets in je Application scope. Desnoods schrijf je bestandjes op je HD weg.

Maar ik neem aan dat het woord ook ergens vandaan moet komen, dus je kan ook gewoon een ID van dat woord meesturen, zodat je hem op de server weer gewoon op kan zoeken.
RobIII schreef op maandag 12 september 2011 @ 14:14:
[...]
De viewstate is, AFAIK althans, niet eens encrypted hoor; enkel Base64(?) encoded.
Dat is te configureren: MSDN: Encrypt ViewState in ASP.NET 2.0

Maar dat is inderdaad nog niet eens gegarandeerd.

[ Voor 16% gewijzigd door Woy op 12-09-2011 14:16 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ah cool; dat wist ik niet :P (Doe niet veel met ASP.Net laat staan viewstates :P )

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 21:16

Haan

dotnetter

RobIII schreef op maandag 12 september 2011 @ 14:14:
Je kunt toch gewoon het-te-raden-woord in je sessie knallen? Of denk ik nou zo simpel :?
Dat lijkt mij ook veruit de simpelste oplossing, ook als het om een Webforms applicatie zou gaan, aangezien de data dan op de server blijft.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 12 september 2011 @ 14:15:
[...]

Ik weet niet of er een kant en klaar alternatief is, maar een object serializen en het resultaat encrypten is ook weer niet echt rocket science.

[...]

Ik zeg niet dat je alle objecten naar een database moet schrijven, dat is afhankelijk van je verdere implementatie. Je zou er ook voor kunnen kiezen om het in je Session te stoppen of iets in je Application scope. Desnoods schrijf je bestandjes op je HD weg.

Maar ik neem aan dat het woord ook ergens vandaan moet komen, dus je kan ook gewoon een ID van dat woord meesturen, zodat je hem op de server weer gewoon op kan zoeken.


[...]

Dat is te configureren: MSDN: Encrypt ViewState in ASP.NET 2.0

Maar dat is inderdaad nog niet eens gegarandeerd.
Merci voor de info.
Oefening werkt nu.
Uiteindelijk kan ik het volledig model in Session steken, dan kan ik werken met een simpel get-request.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 12 september 2011 @ 14:34:
[...]
Uiteindelijk kan ik het volledig model in Session steken, dan kan ik werken met een simpel get-request.
Op de vraag of je een GET of POST request moet gebruiken moet je even zoeken op Idempotentie ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1