¿Qué hace Html.HiddenFor?

Respuestas:

112

Crea una entrada oculta en el formulario para el campo (de su modelo) que lo pasa.

Es útil para los campos de su modelo / modelo de vista que necesita para persistir en la página y haber pasado cuando se realiza otra llamada, pero el usuario no debería verlos.

Considere la siguiente clase ViewModel:

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

Ahora desea que la página de edición almacene la ID pero no se vea:

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

Esto da como resultado el equivalente al siguiente HTML:

<form name="form1">
    <input type="hidden" name="Id">2</input>
    <input type="text" name="Value" value="Some Text" />
</form>
Justin Niessner
fuente
<% = Html.HiddenFor (model.Id)%> <br /> en su ejemplo anterior
Bryce Fischer
11
Yo diría "visto" por el usuario. Los usuarios pueden "modificar" lo que quieran, oculto o no.
Craig Stuntz
@ Craig - Tienes razón. De hecho, pensé que cambié esa redacción, pero aparentemente no.
Justin Niessner
Y generalmente se usa para la identificación (como en el ejemplo anterior), que generalmente no desea mostrar.
RickAndMSFT
Estoy un poco confundido porque el modelo de vista no son los parámetros del controlador. Entonces, ¿por qué se generaría el nombre de la entrada en los campos del modelo de vista?
John
8

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

[HttpPost]
public ActionResult Edit(FormCollection collection)
{
    ViewModel.ID = Convert.ToInt32(collection["ID"]);
}
James todavía
fuente
8
Aunque esto es técnicamente cierto, no debería tener que hacer esto si el formulario está fuertemente tipado en un modelo de vista. Debería poder acceder al modelo directamente, lo que elimina la necesidad de realizar conversiones.
Yetti
@Yetti: Incorrecto. Hay una buena razón por la que el mecanismo de andamios agrega el campo ID. Elimínelo de uno de mis tutoriales y use 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 la propiedad For () 'd en la vista, el método del controlador debe ser fuertemente tipado y llenado automáticamente por ModelBinder.
Erik Philips
2

Como muchas funciones, esta se puede usar de muchas formas diferentes para resolver muchos problemas diferentes, creo que es una herramienta más en nuestros cinturones de herramientas.

Hasta ahora, la discusión se ha centrado en gran medida 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 solo una vista a la vez, porque html.beginform crea un nuevo objeto y si su objeto modelo para esa vista ya tenía algunos valores pasados, esos los valores se perderán a menos que proporcione una referencia a esos valores en el formulario de inicio.

Para ver una gran motivación para html.hiddenfor, le recomiendo que vea Pasando datos de una vista a un controlador en .NET MVC - "@model" sin resaltar

Devin Andrés Salemi
fuente