2010-12-07 12 views

Respuesta

75

La mayoría de los métodos de ayuda de MVC tienen una variante XXXFor. Están destinados a ser utilizados en conjunto con una clase de modelo concreto. La idea es permitir que el ayudante obtenga el atributo de "nombre" apropiado para el control de entrada de formulario basado en la propiedad que especifique en el lambda. Esto significa que puede eliminar "cadenas mágicas" que de otro modo tendría que emplear para correlacionar las propiedades del modelo con sus vistas. Por ejemplo:

Html.Hidden("Name", "Value") 

resultará en:

<input id="Name" name="Name" type="hidden" value="Value"> 

En su controlador, puede que tenga una acción como:

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
} 

Y un modelo como:

public class MyModel 
{ 
    public string Name { get; set; } 
} 

El crudo Html.Hidden usamos d arriba se correlacionará con la propiedad Name en el modelo. Sin embargo, es un poco desagradable que el valor "Nombre" para la propiedad debe especificarse utilizando una cadena ("Nombre"). Si cambia el nombre de la propiedad Name en el Modelo, su código se romperá y el error será un tanto difícil de resolver. Por otra parte, si se utiliza HiddenFor, se obtiene protegido de que:

Html.HiddenFor(x => x.Name, "Value"); 

Ahora, si cambia el nombre de la propiedad Name, aparecerá un error de ejecución explícita que indica que la propiedad no se puede encontrar. Además, obtiene otros beneficios del análisis estático, como obtener un menú desplegable de los miembros después de escribir x..

+1

Gracias Kirk, buena información sobre lo que sucede en el controlador y el modelo también. –

+4

En realidad, obtiene un error COMPILADOR, no un error RUNTIME si cambia el nombre de la propiedad. Ese es el punto, fallar en la compilación, no ejecutar. –

+2

@Mystere Man, las vistas generalmente no se compilan (cuando construyes tu solución). [Es un paso manual] (http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc) para que VS los compile por usted. –

7

Todos los métodos en HtmlHelper clase tiene un gemelo con For sufijo. Html.Hidden toma una cadena como un argumento que debe proporcionar, pero Html.HiddenFor toma un Expresión que si ve es una vista inflexible se puede beneficiar de esto y alimentar ese método lambda expresión como este

o=>o.SomeProperty 

en lugar de "SomeProperty" en el caso de utilizar Html.Hidden método.

+0

Gracias a Jani por la información sobre los gemelos ayudantes. –

9

El Html.Hidden crea una entrada oculta. Pero tiene que especificar el nombre y todos los atributos que desea dar a ese campo y el valor, mientras que el Html.HiddenFor crea una entrada oculta para el objeto que le pasa , se ven así:

Html.Hidden("yourProperty",model.yourProperty); 

Html.HiddenFor(m => m.yourProperty) 

En este caso, la salida es la misma!

+0

por lo que, en una palabra, oculto es algo creado por el código y hiddenfor es una referencia a lo que ha creado en el código correcto? – Twocode

+0

twocode - no, ambos son creados por el código, pero el compilador puede detectar el nombre de propiedad real de la expresión, manteniendo las cosas consistentes con el modelo. Esto se usa para el encuadernado automático de modelos. –

2

Html.Hidden y Html.HiddenFor usado para generar pares nombre-valor que esperaron por el método de acción en el controlador.Uso muestra (*):

@using (Html.BeginForm("RemoveFromCart", "Cart")) { 
        @Html.Hidden("ProductId", line.Product.ProductID) 
        @Html.HiddenFor(x => x.ReturnUrl) 
        <input class="btn btn-sm btn-warning" 
          type="submit" value="Remove" /> 
       } 

Si su método de acción esperar a que "ProductID" hay que generar este nombre en forma a través de uso (o Html.Hidden Html.HiddenFor) Para el caso de que no es posible para generar este nombre con un modelo muy tipado, simplemente escriba este nombre con una cadena que sea "IdProducto".

public ViewResult RemoveFromCart(int productId, string returnUrl){...} 

Si hubiera escrito Html.HiddenFor (x => line.Product.ProductID), el ayudante haría un campo oculto con el nombre "line.Product.ProductID". El nombre del campo no coincide con los nombres de los parámetros del método de acción "RemoveFromCart" que espera el nombre de "ProductId". Esto evitaría que las carpetas modelo predeterminadas funcionen, por lo que MVC Framework no podría llamar al método.

* Adam Freeman (Apress - Pro ASP.Net MVC 5)

3

Html.Hidden ('nombre', 'valor') crea una etiqueta con el nombre oculto = 'nombre' y el valor = 'valor'.

Html.HiddenFor (x => x.nameProp) crea una etiqueta oculta con un name = 'nameProp' y value = x.nameProp.

En su valor nominal, estos parecen hacer cosas similares, con uno simplemente más conveniente que el otro. Pero su valor real es para el enlace del modelo. Cuando MVC intenta asociar el html al modelo, necesita tener el nombre de la propiedad, y para Html.Hidden, elegimos 'nombre', y no 'nombreProp', y por lo tanto, el enlace no funcionaría. Tendría que tener un objeto de enlace personalizado u obtener los valores de los datos del formulario. Si está redistribuyendo la página, tendrá que volver a establecer el modelo en los valores.

Para que pueda usar Html.Hidden, pero si obtiene el nombre incorrecto, o si cambia el nombre de la propiedad en el modelo, el enlace automático fallará cuando envíe el formulario. Pero al usar un tipo de expresión marcada, obtendrá la finalización del código, y cuando cambie el nombre de la propiedad, obtendrá un error de tiempo de compilación. Y luego tiene la garantía de tener el nombre correcto en el formulario.

Una de las mejores funciones de MVC.

Cuestiones relacionadas