Cosa fa Html.HiddenFor?


105

Sebbene abbia letto la documentazione su Html.HiddenFor, non ho capito a cosa serve ...

Qualcuno potrebbe spiegarne gli usi e fornire un breve esempio?

Dove dovrebbero andare quegli helper nel codice?

Risposte:


112

Crea un input nascosto nel modulo per il campo (dal tuo modello) che lo passi.

È utile per i campi nel tuo Model / ViewModel che devi persistere nella pagina e sono passati indietro quando viene effettuata un'altra chiamata ma non dovrebbero essere visti dall'utente.

Considera la seguente classe ViewModel:

public class ViewModel
{
    public string Value { get; set; }
    public int Id { get; set; }
}

Ora vuoi che la pagina di modifica memorizzi l'ID ma non venga visualizzato:

<% using(Html.BeginForm() { %>
    <%= Html.HiddenFor(model.Id) %><br />
    <%= Html.TextBoxFor(model.Value) %>
<% } %>

Ciò risulta nell'equivalente del seguente HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>

<% = Html.HiddenFor (model.Id)%> <br /> nel suo esempio sopra
Bryce Fischer

11
Direi "visto" dall'utente. Gli utenti possono "modificare" tutto ciò che vogliono, nascosto o meno.
Craig Stuntz

@ Craig - Hai ragione. In realtà ho pensato di aver cambiato quella formulazione, ma a quanto pare no.
Justin Niessner

Ed è in genere utilizzato per l'ID (come nell'esempio sopra), che generalmente non si desidera visualizzare.
RickAndMSFT

Sono un po 'confuso perché il modello di visualizzazione non è i parametri del controller. Allora perché il nome dell'input dovrebbe essere generato nei campi del modello di visualizzazione?
Giovanni

8

E per utilizzare nuovamente l'input dell'ID nascosto nel metodo di azione Modifica:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}

8
Sebbene questo sia tecnicamente vero, non dovresti farlo se il modulo è fortemente tipizzato in un modello di visualizzazione. Dovresti essere in grado di accedere direttamente al modello, il che elimina la necessità di eseguire qualsiasi conversione.
Yetti

@ Yetti: errato. C'è una buona ragione per cui il meccanismo di scaffolding aggiunge il campo ID. Rimuovilo da uno dei miei tutorial e usa Fiddler per vedere che non è nel corpo del post.
RickAndMSFT

2
Non sono sicuro di come il commento sia errato. Se il Model è la proprietà For () 'd nella vista, il metodo del controller dovrebbe essere fortemente tipizzato e popolato automaticamente dal ModelBinder.
Erik Philips,

2

Come molte funzioni, questa può essere utilizzata in molti modi diversi per risolvere molti problemi diversi, penso che sia ancora un altro strumento nelle nostre cinture degli strumenti.

Finora, la discussione si è concentrata molto sul semplice nascondere un ID, ma questo è solo un valore, perché non usarlo per molti valori! Questo è quello che sto facendo, lo uso per caricare i valori in una classe solo una vista alla volta, perché html.beginform crea un nuovo oggetto e se il tuo oggetto modello per quella vista aveva già alcuni valori passati, quelli i valori andranno persi a meno che non si fornisca un riferimento a tali valori nel modulo iniziale.

Per vedere una grande motivazione per html.hiddenfor, ti consiglio di vedere Passaggio di dati da una vista a un controller in .NET MVC - "@model" non evidenziato


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.