¿Por qué campos con style = "display: hidden" post back?

noneTengo un formulario donde el usuario puede ocultar o mostrar campos haciendo clic en una checkbox. Estoy escondiendo los campos así:

$("#ContactDetail_PostalAddressSameAsAddress").change(function () { if ($(this).prop('checked') != true) { $("#PostalAddressContainer").show("fast"); $('#PostalAddressContainer :input').show(); } else { $("#PostalAddressContainer").hide("fast"); $('#PostalAddressContainer :input').hide(); } }); 

Tenía la printing de que el campo con style = "display: none" no se publicaba. Sin embargo, cuando envío el formulario, la validation del lado del cliente no valida los campos ocultos, que es lo que espero. Pero, en el lado del server, ModelState.IsValid es falso debido a la visualización obligatoria: no se han configurado ninguno.

En fiddler puedo ver los datos de formulario para la pantalla: ninguno campos. Por favor ayuda.

Pruebe a deshabilitar el campo de formulario:

 $("#PostalAddressContainer").prop("disabled", true); 

Si solo está oculto, se enviará junto con la request POST. CSS nunca debe tener ningún efecto en el comportamiento de la forma ya que su propósito es cambiar la forma en que se muestran las cosas.

Tenga en count que este es también el punto principal de <input type="hidden"> – para que no se muestre al usuario, pero se envíe junto con la request.

Puedes deshabilitarlo

 $('#PostalAddressContainer').attr('disabled', 'disabled'); 

que no será considerado en una request POST.

Lamentablemente, su printing fue incorrecta. Todos los controles exitosos son serializados y enviados por el browser cuando se envía un formulario.

La especificación HTML define qué hace que un control tenga éxito.

Un control exitoso es "válido" para la presentación. Cada control exitoso tiene su nombre de control emparejado con su valor actual como parte del set de datos del formulario enviado. Un control exitoso debe definirse dentro de un elemento FORM y debe tener un nombre de control.

Sin embargo:

  • Los controles que están deshabilitados no pueden ser exitosos.
  • Si un formulario contiene más de un button de envío, solo el button de envío activado tiene éxito.
  • Todas las casillas de verificación "activadas" pueden ser exitosas.
  • Para los botones de opción que comparten el mismo valor del atributo de nombre, solo el button de opción "activar" puede ser exitoso.
  • Para los menus, el nombre de control es provisto por un elemento SELECT y los valores son provistos por los elementos OPTION. Solo las opciones seleccionadas pueden ser exitosas. Cuando no se seleccionan opciones, el control no tiene éxito y ni el nombre ni los valores se envían al server cuando se envía el formulario.
  • El valor actual de una selección de file es una list de uno o más nombres de file. Al enviar el formulario, los contenidos de cada file se envían con el rest de los datos del formulario. El contenido del file se empaqueta de acuerdo con el tipo de contenido del formulario.
  • El valor actual de un control de object está determinado por la implementación del object.

Si un control no tiene un valor actual cuando se envía el formulario, los agentes de usuario no están obligados a tratarlo como un control exitoso.

Además, los agentes de usuario no deberían considerar exitosos los siguientes controles:

  • Restablecer botones.
  • Elementos OBJECT cuyo atributo de statement se ha establecido.

Los controles y controles ocultos que no se procesan debido a la configuration de la hoja de styles aún pueden ser exitosos.

La especificación dice explícitamente que los elementos de formulario ocultos deben enviarse al server.

Además de ocultar los campos, debe deshabilitarlos .

 $("#PostalAddressContainer :input").prop("disabled", true).hide(); 

No estoy muy seguro de cuál es la pregunta, pero ese es un comportamiento normal. También debe agregar la validation del lado del server, ya que su aplicación requiere una lógica de validation más personalizada.

Por cierto, la validation del lado del server también es una práctica recomendada

style = "display: hidden" no es válido. Creo que lo estás confundiendo con style = "visibility: hidden;"

Creo que quieres usar style = "display: none;"