2013-06-04 12 views
5

Sono ancora relativamente nuovo in ASP.NET MVC 3 e ho una domanda concettuale per quelli di voi con più esperienza qui.Dati modello non formattati persistenti in ASP.NET MVC

Diciamo per esempio (semplice) Ho un modulo di iscrizione per un evento. Il modulo mostrerebbe il nome dell'evento e una casella di testo in cui l'utente potrebbe inserire il proprio nome. Il ViewModel sarebbe simile a questa:

public class SignupFormViewModel { 
    public string EventName { get; set; } 
    [Required] 
    public string VolunteerName { get; set; } 
} 

La vista Razor potrebbe essere simile a questa:

<h2>Sign up for @Model.EventName</h2> 
@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<div class="editor-field"> 
    @Html.EditorFor(model => model.VolunteerName) 
    @Html.ValidationMessageFor(model => model.VolunteerName ) 
</div> 
} 

Se l'utente invia il form al server e il ModelState non è valido, torniamo alla originale Visualizza e restituisce il modello in modo da poter visualizzare gli errori. (supponiamo per questo esempio che questo sia un errore non gestito sul client)

Il problema è che nella mia vista di esempio mostrata sopra, EventName non viene inviato con i dati del modulo. Voglio solo usarlo per il contenuto della pagina, non un campo modulo. Ma se devo tornare indietro e mostrare errori di validazione all'utente, ho perso la proprietà EventName.

Quindi, quali sono le mie opzioni per preservare questo elemento non di campo attraverso un post che ritorna alla stessa vista?

So che posso rendere un campo nascosto per contenere la proprietà EventName, ma c'è solo qualcosa che non ha l'odore giusto di essere costretto a mettere ogni proprietà di campo non formata in un campo nascosto. So anche che potrei entrare nell'azione HttpPost nel mio controller e ricaricare i dati nel modello prima di restituire la vista, ma anche quello è goffo.

Credo di avere una buona comprensione dei modi di base per farlo, ma mi chiedevo se c'era un modo migliore o una pratica migliore che si sentiva più pulito ... o se dovessi solo imparare ad affrontarlo: -)

Grazie

risposta

5

Non c'è niente di sbagliato con l'utilizzo di un campo nascosto per questo. Questo è un modo abbastanza convenzionale di persistere su una richiesta quando in realtà non si desidera che vengano visualizzati come campi modulo.

Tenete a mente che HTTP è stateless, così cadendo qualcosa sulla pagina e riprenderla nella richiesta POST è - di fatto - un modo più conforme di persistenza che i dati su più richieste rispetto utilizzando un altro meccanismo che dà l'illusione di stato.

Se ritieni che questo sovraccarichi troppo il tuo markup, potresti provare a inserire i valori nella raccolta TempData sulla richiesta GET iniziale, che esisterà solo per la durata della richiesta successiva, permettendoti di prenderlo nella vostra prossima azione di controllo:

TempData["MyVar"] = model.EventName 

Tuttavia, se si desidera che questo essere mantenuta nel modello come è il convenzionale (e - a mio parere - migliore) modo di fare questo, i campi nascosti sono ancora il modo di vai:

@Html.HiddenFor(m => m.EventName) 

Per ulteriori letture, si potrebbe anche considerare cookies o session state, sebbene nessuno di questi persisterà il valore nel modello.Entrambi questi meccanismi hanno i loro limiti, tuttavia, che descrivo in another answer, here.

+0

Optando per ViewData su TempData. TempData rende l'uso non necessario della sessione. ViewData si intende specificamente per modificare la vista. Un'altra opzione a ciò che viene suggerito è di rigonfiare (reimpostare) EventName nella VM. –

+0

@EliGassert Tutto 'ViewData' non ti permette di compilare un campo nella vista, che verrà poi posticipato - dovresti comunque renderizzare un campo nascosto, quindi non è buono come alternativa! –

+0

Grazie a @Ant P, penso che resterò con i campi nascosti. Apprezzo la spiegazione/logica riflessiva. –

Problemi correlati