2009-09-16 11 views
6

Tengo un formulario que, por el solo hecho de aislar el problema, tiene aproximadamente una docena de casillas HTML sencillas (no WebControls), todas deshabilitadas. Están dentro de un UpdatePanel.__DoPostback devuelve los valores de los controles deshabilitados al hacer una devolución de datos parcial

que tienen un enlace que llama

__doPostBack('a-control','my-custom-argument');

Dependiendo del primer argumento que la oferta, la página puede hacer una completa postback o parcial.

Cuando hago un total de postback, ninguno de los valores de la casilla de verificación se envían en la publicación (porque están deshabilitados). Este es el normal y por lo tanto comportamiento deseado.

Sin embargo, cuando hace una parcial postback, la secuencia de comandos recoge todos los valores de mis casillas de verificación y los envía, sin indicar cuáles están deshabilitados, lo que rompe mi código.

Es molesto y me gustaría que se comporte de manera consistente. ¿Hay alguna forma de decirle al controlador de JavaScript .NET que funcione de la manera en que lo hace el resto del mundo y nopostback los valores de deshabilitados ¿Elementos de formulario HTML?

Respuesta

2

puedo sugerir dos opciones:

1) Se puede quitar el atributo name de controles discapacitados con JavaScript justo antes de hacer la devolución de datos.

2) Anule Sys.WebForms.PageRequestManager.getInstance()._onFormSubmit con la versión corregida del código. Sólo tienes que copiar la aplicación de MicrosoftAjaxWebForms.debug.js, añadir un manejo para el atributo disabled y adjuntar la función corregida al objeto existente PageRequestManager:

Sys.WebForms.PageRequestManager.getInstance() ._ onFormSubmit = función ...

continuación, se registra este bloque JS como secuencia de comandos de inicio. Es importante obtener un orden correcto de los bloques de scripts renderizados. Hago algo similar en mi subclase de ScriptManager:

protected override void OnResolveScriptReference(ScriptReferenceEventArgs e) { 
    base.OnResolveScriptReference(e); 

    if (e.Script.Name.StartsWith("MicrosoftAjax")) 
     Page.ClientScript.RegisterStartupScript(GetType(), "My patch", MyPatchJs, true); 
} 

¡Funciona como un encanto!

3

Parece un error para mí. De acuerdo con this, las entradas deshabilitadas deben no enviarse con el formulario.

Aquí está mi página completa prueba:

<%@ Page Language="C#" AutoEventWireup="true" Inherits="System.Web.UI.Page" EnableViewState="false" EnableEventValidation="false" Trace="false" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Test disabled checkboxes</title> 
    <script> 
    initState = false; 
    function disableCheckboxes(disabled) { 
     document.getElementById('foo').disabled = disabled; 
    } 
    </script> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <asp:ScriptManager runat="server" /> 

    <asp:UpdatePanel runat="server"> 
     <ContentTemplate> 
      <input runat="server" type="checkbox" id="foo" name="foo" checked="checked" /> Foo 
      <asp:Button ID="Inside" runat="server" Text="Submit Inside UpdatePanel" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

    <asp:Button ID="Outside" runat="server" Text="Submit Outside UpdatePanel" /> 
    <br /> 
    <button type="button" onclick="disableCheckboxes(initState=!initState)">Toggle checkboxes</button> 
</form> 
</body> 
</html> 

Pasos para reproducir:

  1. Abran Fiddler y la página de prueba.
  2. Haga clic en "Enviar fuera de UpdatePanel" (desencadena una devolución de datos normal). Nota en Fiddler el valor "foo=on" se envía en el cuerpo POST.
  3. Haga clic en "Activar casillas de verificación" para deshabilitar la casilla de verificación.
  4. Haga clic en "Enviar fuera UpdatePanel" nuevamente. Tenga en cuenta que el parámetro "foo" se omite del cuerpo POST. Esto es esperado.
  5. Haga clic en "Enviar dentro de UpdatePanel" (desencadena una devolución de datos parcial).Tenga en cuenta el valor "foo=on" está presente en el cuerpo de POST, a pesar de que debería haberse omitido

El error parece ser en ambos MicrosoftAjaxWebForms.js y MicrosoftMvcAjax.js (y el .debug homólogos de cada):

if ((type === 'text') || 
    (type === 'password') || 
    (type === 'hidden') || 
    (((type === 'checkbox') || (type === 'radio')) && element.checked)) { 
     formBody.append(encodeURIComponent(name)); 
     formBody.append('='); 
     formBody.append(encodeURIComponent(element.value)); 
     formBody.append('&'); 
} 

el atributo disabled en el elemento de ser serializado es C ompletely ignored, va en contra de las especificaciones y el comportamiento de facto de las implementaciones de envío de formularios.

2

En .Net, la etiqueta del formulario tiene el atributo submitdisabledcontrols, que por defecto es falso. Al menos puedes hacer que las cosas se comporten de manera consistente si lo configuras en verdadero.

Cuestiones relacionadas