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
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. –
@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! –
Grazie a @Ant P, penso che resterò con i campi nascosti. Apprezzo la spiegazione/logica riflessiva. –