2012-06-15 21 views
27

Estoy tratando de encontrarme los pies con MVC4 Razor y estoy atascado con este simple problema.MVC4 Razor - @ Html.DisplayFor no vinculante para el modelo

Cuando utilizo @ Html.DisplayFor el modelo siempre se devuelve como NULL, pero cuando uso @ Html.TextBoxPara este modelo está completamente poblado, ¿qué me falta?

Gracias de antemano

+0

Necesito mostrar los campos como "etiquetas". Esta es la razón por; El objetivo de esta vista es permitir al usuario ver los datos antes de enviarlos a la base de datos. ¿Alguna idea de cómo puedo lograr esto? – Jacques

Respuesta

51

Este es un problema común que muchas personas se pierden en el marco asp.net mvc. No solo la diferencia en los helpers como HiddenFor, DisplayFor, TextBoxFor, sino cómo exactamente el marco se configura automáticamente recopilando y validando estas entradas. La magia está hecha con los atributos data- * de HTML5. Al observar la etiqueta de entrada generada, observará que habrá algunas propiedades adicionales en forma de data-val, data-val-required, y quizás algunas propiedades de datos adicionales para los tipos, por ejemplo, los valores numéricos serían data-val-number.

Estos atributos de datos permiten a la extensión jQuery jquery.validate.unobtrusive.js analizar el DOM y luego decidir qué campos validar o generar mensajes de error.

La recopilación real de datos publicados se refleja en la propiedad name. Esto es lo que debe corresponderse con el modelo que está en el método C# o vb [HttpPost].

Utilice HiddenFor cuando desee proporcionar datos publicados que el usuario no necesita conocer.

Utilice DisplayFor cuando desee mostrar registros pero no permita que se editen.

Use TextBoxFor cuando desee permitir la entrada del usuario o permitir que el usuario edite un campo.

EDITAR

"the purpose of this view is to enable the user to view the data before submitting it to the database. Any ideas how I can achieve this?"

Usted puede lograr esto con un dúo de HiddenFor y DisplayFor. Use HiddenFor para tener los valores listos para ser publicados, y DisplayFor para mostrar esos valores.

+0

Muy amable de tu parte. Gracias. – mostafakvd

15

DisplayFor no van a hacer la unión del Modelo. TextBoxFor lo hará porque crea un elemento input en el formulario y el formulario puede manejarlo cuando se publica. Si desea obtener algunos datos en la acción de HttpPost y no desea utilizar TextBoxFor, puede mantener esa propiedad de modelo de pirticulare en una variable oculta dentro del formulario utilizando el método de ayuda de HTML HiddenFor como este.

@using(Html.BeginForm()) 
{ 
    <p>The Type Name is</p> @Html.DisplayFor(x=>x.TypeName) 
    @Html.HiddenFor(x=>x.TypeName) 
    <input type="submit" value="Save" /> 
} 
+0

Hola Shyju, Necesito mostrar los campos como "etiquetas". Esta es la razón; El objetivo de esta vista es permitir al usuario ver los datos antes de enviarlos a la base de datos. ¿Alguna idea de cómo puedo lograr esto? – Jacques

+0

! @jacques: Entonces use Displayfor para mostrar los datos al usuario y use HiddenFor para mantener esos en variables ocultas y entonces es bueno hacer una publicación de formulario. – Shyju

1

DisplayFor construye una etiqueta HTML, no una entrada. Las etiquetas no están PUBLICADAS al servidor, pero las entradas sí lo están.

0

¿Se refiere a una publicación de formulario? Si usa DisplayFor, esto crea un elemento que no contiene ningún valor de formulario. Por lo general, los usa conjuntamente para crear una etiqueta para su cuadro de texto y luego usa Html.TextBoxFor para permitir que los usuarios modifiquen el elemento de datos.

Ejemplo:

@Html.DisplayFor(x=>x.Item) 
@Html.TextBoxFor(x=>x.Item) 

rendirá

Item <a text input field following> 

O en HTML

<label for="Item">Item</label><input type="Text" id="Item" name="Item"/> 
5

Utilice ambos DisplayFor y HiddenFor. DisplayFor simplemente muestra el texto y no es un campo de entrada, por lo tanto, no se devuelve. HiddenFor en realidad crea <input type="hidden" value="xxxx"/>

Cuestiones relacionadas