Que fait Html.HiddenFor?

105

Bien que j'ai lu la documentation sur Html.HiddenFor, je n'ai pas compris à quoi ça sert ...

Quelqu'un pourrait-il expliquer ses utilisations et donner un court exemple?

Où ces assistants devraient-ils aller dans le code?

JPCF
la source

Réponses:

112

Il crée une entrée masquée sur le formulaire pour le champ (de votre modèle) que vous lui transmettez.

Il est utile pour les champs de votre Model / ViewModel dont vous avez besoin pour persister sur la page et que vous avez repassés lorsqu'un autre appel est effectué mais que l'utilisateur ne doit pas voir.

Considérez la classe ViewModel suivante:

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

Vous voulez maintenant que la page d'édition stocke l'ID, mais ne l'avez pas vu:

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

Cela donne l'équivalent du code HTML suivant:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Justin Niessner
la source
<% = Html.HiddenFor (model.Id)%> <br /> dans son exemple ci
Bryce Fischer
11
Je dirais "vu" par l'utilisateur. Les utilisateurs peuvent "modifier" tout ce qu'ils veulent, masqué ou non.
Craig Stuntz
@Craig - Vous avez raison. En fait, j'ai pensé avoir changé ce libellé, mais apparemment pas.
Justin Niessner
Et il est généralement utilisé pour l'ID (comme dans l'exemple ci-dessus), que vous ne souhaitez généralement pas afficher.
RickAndMSFT
Je suis un peu confus car le modèle de vue n'est pas les paramètres du contrôleur. Alors, pourquoi le nom de l'entrée serait-il généré sur les champs du modèle de vue?
John
8

Et pour consommer l'entrée d'ID masqué dans votre méthode d'action Modifier:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
James Still
la source
8
Bien que cela soit techniquement vrai, vous ne devriez pas avoir à le faire si le formulaire est fortement typé dans un modèle de vue. Vous devriez pouvoir accéder directement au modèle, ce qui élimine le besoin d'effectuer toute conversion.
Yetti
@Yetti: incorrect. Il y a une bonne raison pour laquelle le mécanisme d'échafaudage ajoute le champ ID. Supprimez-le de l'un de mes tutoriels et utilisez Fiddler pour voir qu'il n'est pas dans le corps de l'article.
RickAndMSFT
2
Je ne sais pas en quoi le commentaire est incorrect. Si le modèle est la propriété For () 'd dans la vue, la méthode du contrôleur doit être fortement typée et automatiquement remplie par ModelBinder.
Erik Philips du
2

Comme beaucoup de fonctions, celle-ci peut être utilisée de différentes manières pour résoudre de nombreux problèmes différents, je pense que c'est un autre outil de nos ceintures d'outils.

Jusqu'à présent, la discussion s'est fortement concentrée sur le simple fait de cacher un identifiant, mais ce n'est qu'une valeur, pourquoi ne pas l'utiliser pour de nombreuses valeurs! C'est ce que je fais, je l'utilise pour charger les valeurs d'une classe une seule vue à la fois, car html.beginform crée un nouvel objet et si votre objet modèle pour cette vue avait déjà des valeurs qui lui ont été transmises, celles-ci les valeurs seront perdues à moins que vous ne fournissiez une référence à ces valeurs dans le formulaire de début.

Pour voir une grande motivation pour le html.hiddenfor, je vous recommande de voir Passer des données d'une vue à un contrôleur dans .NET MVC - "@model" ne mettant pas en évidence

Devin Andres Salemi
la source