2010-10-05 18 views
97

Chociaż czytałem dokumentację na Html.HiddenFor, nie zrozumiałem, do czego jest używany ...Co robi Html.HiddenFor?

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

Gdzie te pomocników iść w kodzie?

Odpowiedz

101

Tworzy ukryte wejście na formularzu dla pola (od modelu), które przechodzą go.

Jest to użyteczne dla pól w modelu/ViewModel, które trzeba utrzymywać na stronie i które przeszły z powrotem, gdy inne połączenie jest wykonane, ale nie powinny być postrzegane przez użytkownika.

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

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

Teraz chcesz stronę edycji przechowywać identyfikator, ale mają nie być widziany:

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

Powoduje to równowartość następujący kod HTML :

+0

Gdzie należy, że pomocnik iść w kodzie? – JPCF

+0

<% = Html.HiddenFor (model.Id)%>
w swoim przykładzie powyżej –

+9

Powiedziałbym "widziane" przez użytkownika. Użytkownicy mogą "modyfikować" wszystko, co chcą, ukryć lub nie. –

7

I do pochłaniania ukrytego dowodu tożsamości z powrotem do metody akcji edycji:

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

Chociaż jest to prawdą techniczną, nie powinieneś tego robić, jeśli formularz jest silnie wpisany w model widoku. Powinieneś mieć możliwość bezpośredniego dostępu do modelu, co eliminuje konieczność jakiejkolwiek konwersji. – Yetti

+0

@Yetti: Niepoprawnie. Jest dobry powód, dla którego mechanizm rusztowania dodaje pole ID. Usuń go z jednego z moich tutoriali i użyj Fiddlera, aby zobaczyć, że nie ma go w treści postu. – RickAndMSFT

+2

Nie jestem pewien, w jaki sposób komentarz jest nieprawidłowy. Jeśli Model jest własnością * Dla() * 'd w widoku, metoda kontrolera powinna być silnie wpisana i automatycznie wypełniana przez moduł ModelBinder. –

2

Podobnie jak wiele funkcji, ten może być używany na wiele różnych sposobów, aby rozwiązać wiele różnych problemów, myślę, że jest to kolejne narzędzie w naszych paskach narzędzi.

tej pory dyskusja koncentrowała się w dużej mierze na po prostu ukrywa identyfikator, ale to jest tylko jedna wartość, to dlaczego nie wykorzystać go na wiele wartości! Właśnie to robię, używam go do ładowania wartości w klasie tylko jeden widok na raz, ponieważ html.beginform tworzy nowy obiekt i jeśli twój obiekt modelu dla tego widoku ma już pewne wartości przekazane do niego, te wartości zostaną utracone, chyba że podasz odniesienie do tych wartości w beginformie.

Aby zobaczyć wielką motywację do html.hiddenfor, polecam zobaczyć Passing data from a View to a Controller in .NET MVC - "@model" not highlighting