2012-03-19 19 views
10

Tengo una nueva aplicación MVC 4 con una vista/controlador bastante básico. El modelo asociado contiene un par de propiedades que he asignado a Hidden campos de formulario. Cuando la página se representa por primera vez (, por ejemplo, a través de HttpGet Action), todo se ve bien. Pero cuando se ingresa el formulario seleccionando el botón Enviar, el Modelo resultante presentado a la Acción ya no tiene configurados los valores del campo Oculto. Aquí hay un recorrido por los detalles.Campos de formulario ocultos que no aparecen en el modelo MVC después de la devolución posterior

Aquí es una muestra de la Modelo:

public class Application 
{ 
    public bool ShowSideBars { get; set; } 
} 

Aquí es el controlador inicial * Acción * (que parece funcionar bien):

[HttpGet] 
public ActionResult Application() 
{ 
    var model = Request.ParseFromQueryString<Application>(); 
    model.ShowSideBars = true; 

    return View(model); 
} 

Esto se asigna al Ver de la siguiente manera:

<fieldset> 
    @Html.HiddenFor(m => m.ShowSideBars) 
... 
</fieldset> 

Esto se traduce en la siguiente margen de que pudiera ser emitida dentro del conjunto de campos:

<input data-val="true" data-val-required="The ShowSideBars field is required." id="ShowSideBars" name="ShowSideBars" type="hidden" value="True" /> 

Nota: estoy seguro que desearía saber qué MVC ha decidido añadir el'. .. se requiere campo 'contenido cuando no lo marca como se requiere, pero eso es para otra pregunta

Aquí está el Actio n que se invoca cuando se envía el formulario. En este punto, la propiedad antes mencionada ya no se establecerá en 'true'.

[HttpPost] 
public ActionResult Application(Application application) 
{ 
    // Other work done here 

    return View(application); 
} 

En la actualidad, no hay carpetas de modelos personalizados. Además, he probado algunos otros tipos de datos y estoy viendo lo mismo.

¿Alguien puede explicar por qué los valores ocultos del formulario no se devuelven? ¿Estoy haciendo todo mal?

+2

El '-val-required' datos se rindió porque el modelo tipo es 'bool'. Bools por defecto son obligatorios, tienen que ser verdaderos o falsos. Si no desea ver el valor de datos requerido, convierta la propiedad en 'bool?'. – danludwig

+1

Como anotación adicional, las anotaciones de datos agregan 'requerido' a cualquier tipo que no admite nulos. Ints y Bools se marcarán automágicamente según sea necesario. –

+0

@danludwig ¡Excelente idea! Gracias. Esto evitará una pequeña hinchazón en el tamaño total de la página. – JoeGeeky

Respuesta

6

No puedo reproducir el problema (ASP.NET MVC 4 Beta ejecutándose en VS 2010 .NET 4.0).

Modelo:

public class Application 
{ 
    public bool ShowSideBars { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Application() 
    { 
     var model = new Application(); 
     model.ShowSideBars = true; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Application(Application application) 
    { 
     return Content(application.ShowSideBars.ToString()); 
    } 
} 

Vista:

@model Application 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.ShowSideBars) 
    <button type="submit">OK</button> 
} 

Cuando envíe el formulario, el aglutinante modelo asigna correctamente la propiedad ShowSideBars en la acción POST para cierto.

Nota: Me gustaría saber por qué MVC ha decidido agregar el '... campo es requerido contenido' cuando no lo hice marcarlo como sea necesario, pero eso es otra cuestión para

Eso es porque siempre se requieren tipos que no son anulables como booleanos. Se podría dejar de ayudantes ASP.NET MVC entre la emisión del HTML 5 Data- * validación del lado del cliente para ellos atribuye al poner la siguiente línea en Application_Start:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
+0

No puedo explicarlo, pero cuando apliqué los cambios a los Modelos y la Vista para admitir los tipos anulables para los campos ocultos, todo comenzó a funcionar. Gracias. – JoeGeeky

+0

Creo que MVC marcó el campo como requerido porque bool no es un tipo que admite nulo. Si desea eliminar el requisito, deberá usar bool? como el tipo. – Kevin

8

Si usted tiene la propiedad en su modelo decorado con una ReadOnlyAttribute el valor será no se debe volver a poblar el modelo por usted. Después de todo, es de solo lectura.

+5

creé el mismo error al tener un setter privado para el campo – Kieran

+1

tenía una propiedad que era 'interna'. sí, eso lo hizo (vs helper para agregar propiedades del código escrito agregó la propiedad como conjunto interno –

2

simplemente tuve el mismo problema. El formulario no envió la propiedad oculta porque la clase de modelo no tenía un getter getter y setter apropiado para esa propiedad. Sé que no es el problema que tenía, simplemente pensé que podría ayudar a otras personas que prestarán en esta página.

4

creo que los campos deben estar dentro de las etiquetas de formulario HTML para los que están ocultos a ser enviado por correo y no ignorados

+0

Esto es cierto. Poner todo el campo oculto dentro de la etiqueta del formulario resuelve mi problema. – Ariwibawa

0

En mi caso fue porque había declarado un campo en lugar de una propiedad:

public BaseController.Modes Mode; 

no funciona. Pero:

public BaseController.Modes Mode { get; set; } 

funciona. La carpeta de modelo predeterminada solo funciona con propiedades.

0

No bromeo, esta es otra razón por la que podría suceder.

Mi formulario tenía el mismo campo dos veces. El otro campo en realidad no estaba en la forma, pero eso no importa.

Ejecutar este jQuery en la consola de desarrollador para ver cuántos elementos volver:

$("[id$=PropertyName]"); // Search for ids ending with property name. 

Ejemplo:

enter image description here

Cuestiones relacionadas