Co robi Html.HiddenFor?

105

Chociaż przeczytałem dokumentację na temat Html.HiddenFor, nie zrozumiałem, do czego służy ...

Czy ktoś mógłby wyjaśnić jego zastosowania i podać krótki przykład?

Gdzie ci pomocnicy powinni się znaleźć w kodzie?

JPCF
źródło

Odpowiedzi:

112

Tworzy ukryte dane wejściowe w formularzu dla pola (z Twojego modelu), które je przekazujesz.

Jest to przydatne w przypadku pól w Twoim modelu / modelu widoku, które musisz zachować na stronie i które zostały przekazane z powrotem, gdy wykonywane jest inne wywołanie, ale nie powinny być widoczne dla użytkownika.

Rozważmy następującą klasę ViewModel:

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

Teraz chcesz, aby strona edycji przechowywała identyfikator, ale czy nie jest on widoczny:

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

Powoduje to odpowiednik następującego kodu HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Justin Niessner
źródło
<% = Html.HiddenFor (model.Id)%> <br /> w swoim przykładzie powyżej
Bryce Fischer
11
Powiedziałbym „widziany” przez użytkownika. Użytkownicy mogą „modyfikować” wszystko, co chcą, ukryte lub nie.
Craig Stuntz
@Craig - Masz rację. Właściwie myślałem, że zmieniłem to sformułowanie, ale najwyraźniej nie.
Justin Niessner
Zwykle jest używany jako identyfikator (jak w powyższym przykładzie), którego generalnie nie chcesz wyświetlać.
RickAndMSFT
Jestem trochę zdezorientowany, ponieważ model widoku nie jest parametrami kontrolera. Dlaczego więc nazwa danych wejściowych byłaby generowana w polach modelu widoku?
John
8

Aby wykorzystać dane wejściowe ukrytego identyfikatora z powrotem w metodzie akcji Edit:

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
James Still
źródło
8
Chociaż jest to technicznie prawdziwe, nie należy tego robić, jeśli formularz jest silnie wpisany do modelu widoku. Powinieneś mieć bezpośredni dostęp do modelu, co eliminuje potrzebę wykonywania jakichkolwiek konwersji.
Yetti,
@Yetti: Niepoprawnie. Jest dobry powód, dla którego mechanizm tworzenia szkieletów dodaje pole ID. Usuń go z jednego z moich samouczków i użyj programu Fiddler, aby zobaczyć, że nie ma go w treści postu.
RickAndMSFT
2
Nie jestem pewien, dlaczego komentarz jest nieprawidłowy. Jeśli Model jest właściwością For () 'd w widoku, metoda kontrolera powinna być silnie wpisana i automatycznie wypełniona przez ModelBinder.
Erik Philips,
2

Podobnie jak wiele funkcji, ta może być używana na wiele różnych sposobów do rozwiązywania wielu różnych problemów, myślę o niej jako o kolejnym narzędziu w naszych paskach narzędzi.

Do tej pory dyskusja skupiała się głównie na zwykłym ukrywaniu identyfikatora, ale to tylko jedna wartość, dlaczego nie użyć jej dla wielu wartości! To właśnie robię, używam go do ładowania wartości w klasie tylko w jednym widoku na raz, ponieważ html.beginform tworzy nowy obiekt i jeśli twój model dla tego widoku ma już przekazane wartości, te wartości zostaną utracone, chyba że podasz odniesienie do tych wartości w beginform.

Aby zobaczyć wielką motywację dla html.hiddenfor, polecam zobaczyć Przekazywanie danych z widoku do kontrolera w .NET MVC - "@model" nie wyróżnia się

Devin Andres Salemi
źródło