Jeg er igang med at kode en applikation i ASP.NET MVC og som sædvanlig kommer der mindre udfordringer hen ad vejen. Den første jeg er stødt på idag er ViewState 2.0 som åbenbart er implementeret i ASP.NET MVC 2.0 :)
I et foreach loop outputter jeg en liste af checkboxe med dynamiske id’er som jeg på et senere tidspunkt skal bruge for identificere om hver enkelt checkbox er checked af eller ej.
<%=Html.CheckBox("item" + item.AuctionItemId, true)%>
Dette har den sideeffekt, at der bliver generet et hidden field i min HTML når sitet køre. Altså en form for ViewState!
<td>
<input checked="checked" id="item1" name="item1" type="checkbox" value="true" />
<input name="item1" type="hidden" value="false" />
</td>
Og den anden ting er, at i min controller er det “sværere” at lave check på hver checkbox er checked af, fordi Request objektet indeholder samtlige checkboxe, også selvom de ikke er krydset af. I mit tilfælde er det altså mindre sejt.
Man kunne med følgende data forstille sig at dette kode var nok:
var isChecked = base.ControllerContext.RequestContext.HttpContext.Request.Form[item];
if (isChecked == "true")
{
...
}
Men det viser sig ved fintælling at der ikke findes en streng med værdien “true”, også selvom den faktisk findes i vores NameValueCollection af checkboxe værdier. Når en checkbox er checked af så er værdien underligt nok sat til “true,false”. I min bog giver det ingen mening, men jeg er sikker på der nok skal være en god forklaring på hvorfor det er sådan.
Istedet for at gør som ovenstående har jeg istedet skrevet:
<input type="checkbox" checked="checked" name="item<%=item.AuctionItemId %>" />
Og det giver et resultat som jeg ønsker, nemlig, at kun de checkboxe der er checked ryger med over (det er sådan det iførlge standarden også skal være).
Og nu behøver ganske simpelt ikke min if sætning i loopet når jeg skal checke for værdierne.
var isChecked = base.ControllerContext.RequestContext.HttpContext.Request.Form[item];
...
Fordi det er kun de checkboxe som er checked der bliver sendt over wiren.
