Una delle prime cose che si imparano quando si affronta per la prima volta il mondo di ASP.NET MVC provenendo da un'esperienza di WebForms, è che la grande "invenzione" che ha reso tanto popolare quest'ultima tecnologia non esiste più, ossia il ViewState.
Dopo un momento di smarrimento, si cerca di capire come farne a meno (e capirete che di vantaggi ce ne sono!)
Ovviamente i creatori di MVC non ci hanno lasciato con le mani vuote, ma hanno pensato a un modo articolato ma efficace per ottenere lo stesso risultato. In realtà quello che si può ottenere "gratis" dal framework è il mantenimento del valore effettivo di un input control (dunque non le altre proprietà come Visible, Color, ecc..)
Prendiamo ad esempio una textbox:
<%= Html.TextBox("SearchText","testo di default")%>
e il seguente Action method invocato dal submit presente nella pagina della textbox:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Search(string SearchText)
{
return View();
}
Mandando in esecuzione il codice vedremo che alla prima apertura della pagina la textbox avrà il valore "testo di default", modificando la textbox e premendo il bottone di submit la textbox viene renderizzata con il valore modificato. La textbox ha mantenuto lo stato!
Cosa è successo??
Tutto ciò è dovuto al fatto che "per convenzione" il framework MVC valorizza i controlli presenti in una pagina prendendone i valori secondo una scala di priorità di seguito riportata:
1 MVC controlla se è presente un valore nella proprietà ModelState["SearchText"].Value.AttemptedValue. ModelState è una collection in cui sono aggiunti TUTTI i valori che i model binder trasferiscono al controller. La collection diventa utile quando si vuole far apparire un messaggio di errore di validazione e non si vuole perdere al post della pagina quello che l'utente ha inserito.
2 MVC controlla se è presente un valore di default del controllo (nel nostro caso la stringa "testo di default")
3 MVC controlla se è presente un valore per l'elemento ViewData["SearchText"]. ViewData è la collection che il Controller passa alla View con tutti i dati sul modello.
4 MVC controlla se è presente un valore per l'elemento ViewData.Model.SearchText . ViewData.Model è l'oggetto che viene passato dal Controller alla View come modello
Tornando al nostro caso, al primo accesso della pagina scatta la regola 2. Il ModelState, infatti, è vuoto mentre la stringa di default è valorizzata.
Al post della pagina, il "miracolo" è possibile proprio per la presenza della proprietà ModelState["SearchText"].Value.AttemptedValue (regola 1). Notare che questa è stata valorizzata poichè la proprietà SearchText è un parametro di ingresso dell'action method e dunque è stata inserita nel ModelState dal model binder. Qualora non ci fosse tale parametro, il ModelState["SearchText"] non sarebbe valorizzato e noi al post della pagina troveremmo di nuovo la stringa "testo di default" (di nuovo regola 2).
E' bene dunque tenere sempre a mente queste priorità in modo da non incorrere in comportamenti non previsti.
Nessun commento:
Posta un commento