Was macht Html.HiddenFor?

105

Obwohl ich die Dokumentation zu Html.HiddenFor gelesen habe, habe ich nicht verstanden, wofür es verwendet wird ...

Könnte jemand seine Verwendung erklären und ein kurzes Beispiel geben?

Wohin sollen diese Helfer im Code gehen?

JPCF
quelle

Antworten:

112

Es erstellt eine versteckte Eingabe in das Formular für das Feld (aus Ihrem Modell), an das Sie es übergeben.

Es ist nützlich für Felder in Ihrem Model / ViewModel, die Sie auf der Seite beibehalten müssen und die bei einem weiteren Anruf zurückgegeben wurden, aber vom Benutzer nicht gesehen werden sollten.

Betrachten Sie die folgende ViewModel-Klasse:

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

Jetzt soll die Bearbeitungsseite die ID speichern, aber nicht angezeigt werden:

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

Dies ergibt das Äquivalent des folgenden HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Justin Niessner
quelle
<% = Html.HiddenFor (model.Id)%> <br /> in seinem obigen Beispiel
Bryce Fischer
11
Ich würde sagen "gesehen" vom Benutzer. Benutzer können alles "ändern", was sie wollen, versteckt oder nicht.
Craig Stuntz
@Craig - Du hast recht. Eigentlich habe ich diesen Wortlaut geändert, aber anscheinend nicht.
Justin Niessner
Und es wird normalerweise für die ID verwendet (wie im obigen Beispiel), die Sie im Allgemeinen nicht anzeigen möchten.
RickAndMSFT
Ich bin etwas verwirrt, weil das Ansichtsmodell nicht die Parameter des Controllers sind. Warum sollte der Name der Eingabe in den Feldern des Ansichtsmodells generiert werden?
John
8

Und um die verborgene ID-Eingabe wieder in Ihre Bearbeitungsaktionsmethode zu übernehmen:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
James Still
quelle
8
Obwohl dies technisch gesehen zutrifft, sollten Sie dies nicht tun müssen, wenn das Formular stark in ein Ansichtsmodell eingegeben wurde. Sie sollten direkt auf das Modell zugreifen können, sodass keine Konvertierung erforderlich ist.
Yetti
@ Yetti: Falsch. Es gibt einen guten Grund, warum der Gerüstmechanismus das ID-Feld hinzufügt. Entfernen Sie es aus einem meiner Tutorials und verwenden Sie Fiddler, um festzustellen, dass es nicht im Post-Body enthalten ist.
RickAndMSFT
2
Ich bin mir nicht sicher, wie der Kommentar falsch ist. Wenn das Modell die Eigenschaft For () 'd in der Ansicht ist, sollte die Controller-Methode stark typisiert und automatisch vom ModelBinder ausgefüllt werden.
Erik Philips
2

Wie viele Funktionen kann auch diese auf viele verschiedene Arten verwendet werden, um viele verschiedene Probleme zu lösen. Ich halte sie für ein weiteres Werkzeug in unseren Werkzeuggürteln.

Bisher konzentrierte sich die Diskussion stark darauf, eine ID einfach auszublenden, aber das ist nur ein Wert. Warum nicht für viele Werte verwenden? Das ist, was ich tue, ich benutze es, um die Werte in einer Klasse jeweils nur in einer Ansicht zu laden, da html.beginform ein neues Objekt erstellt und wenn Ihrem Modellobjekt für diese Ansicht bereits einige Werte übergeben wurden, diese Werte gehen verloren, es sei denn, Sie geben im Startformular einen Verweis auf diese Werte an.

Um eine gute Motivation für die Datei html.hiddenfor zu sehen, empfehle ich, dass Sie das Übergeben von Daten aus einer Ansicht an einen Controller in .NET MVC unter "@model" nicht hervorheben

Devin Andres Salemi
quelle