2010-10-05 37 views
97

Aunque he leído la documentación en Html.HiddenFor, no he comprendido para qué se usa ...¿Qué hace Html.HiddenFor?

¿Alguien podría explicar sus usos y dar un pequeño ejemplo?

Dónde debería ir a un ayudante en el código?

Respuesta

101

Se crea un campo oculto en el formulario para el campo (de su modelo) que se le pasa.

Es útil para los campos del modelo/modelo de vista que debe persistir en la página y han pasado de vuelta cuando se realiza otra llamada, pero no debe ser visto por el usuario.

Tenga en cuenta la siguiente clase de modelo de vista:

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

Ahora desea que la página de edición para almacenar el ID pero tienen no ser visto:

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

Esto se traduce en el equivalente de la siguiente HTML :

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

Dónde debería ir ayudante que en el código? – JPCF

+0

<% = Html.HiddenFor (model.Id)%>
en su ejemplo anterior –

+9

diría "visto" por el usuario. Los usuarios pueden "modificar" cualquier cosa que deseen, oculta o no. –

7

Y para consumir la entrada de ID oculta en su método de acción de edición:

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

Aunque esto es técnicamente cierto, no debería tener que hacer esto si el formulario está fuertemente tipado a un modelo de vista. Debería poder acceder al modelo directamente, lo que elimina la necesidad de realizar conversiones. – Yetti

+0

@Yetti: Incorrecto. Hay una buena razón por la cual el mecanismo de andamio agrega el campo ID. Quítalo de uno de mis tutoriales y usa Fiddler para ver que no está en el cuerpo de la publicación. – RickAndMSFT

+2

No estoy seguro de cómo el comentario es incorrecto. Si el Modelo es propiedad * Para() * 'd en la vista, el método del controlador debe estar fuertemente tipado y completado automáticamente por ModelBinder. –

2

Al igual que muchas funciones, esta puede usarse de muchas maneras diferentes para resolver muchos problemas diferentes, la considero una herramienta más en nuestros toolbelts.

Hasta ahora, la discusión se ha centrado principalmente en simplemente ocultar una identificación, pero ese es solo un valor, ¿por qué no usarlo para muchos valores? Eso es lo que estoy haciendo, lo uso para cargar los valores en una clase de un único punto de vista a la vez, porque html.beginform crea un nuevo objeto y si su objeto de modelo para esa vista ya tenía algunos valores que se le pasan, los los valores se perderán a menos que proporcione una referencia a esos valores en el beginform.

Para ver una gran motivación para el html.hiddenfor, te recomiendo que veas Passing data from a View to a Controller in .NET MVC - "@model" not highlighting