2009-09-16 13 views
6

Ho un modulo che, per isolare il problema, ha una dozzina di caselle di controllo HTML (non WebControls), tutte disabilitate. Si trovano all'interno di un UpdatePanel.__DoPostback registra i valori dei controlli disabilitati quando si effettua un postback parziale

ho un link che chiama

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

In base al primo argomento fornisco, la pagina potrebbe fare una full postback o parziale.

Quando eseguo un valore completo di postback, nessuno dei valori della casella di controllo viene inviato nel post (perché sono disabilitati). Questo è il normale e quindi comportamento desiderato.

Tuttavia, quando esegue uno postback parziale, lo script raccoglie tutti i valori dalle mie caselle di controllo e li invia, senza indicare quali sono stati disabilitati, il che interrompe il mio codice.

È fastidioso e mi piacerebbe che si comportasse in modo coerente. C'è comunque da dire al gestore javascript .NET di funzionare come fa il resto del mondo e nonpostback i valori di disattivati ​​ elementi di modulo HTML?

risposta

2

posso suggerire due opzioni:

1) È possibile rimuovere l'attributo name di controlli disabili con JavaScript poco prima di fare postback.

2) Override Sys.WebForms.PageRequestManager.getInstance()._onFormSubmit con versione corretta del codice. Basta copiare implementazione da MicrosoftAjaxWebForms.debug.js, aggiungere un trattamento per l'attributo disabled e fissare la funzione corretta per l'oggetto esistente PageRequestManager:

Sys.WebForms.PageRequestManager.getInstance() ._ onFormSubmit = funzione ...

Quindi registrare questo blocco JS come script di avvio. È importante ottenere un ordine corretto di blocchi di script renderizzati. Faccio una cosa simile nel mio sottoclasse di ScriptManager:

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

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

funziona come un fascino!

3

Sembra un insetto per me. In base a this gli input disabilitati devono essere non da inviare con il modulo.

Qui è la mia pagina di prova completa:

<%@ 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> 

Procedura per riprodurre:

  1. Aprite il violinista e la pagina di prova.
  2. Fare clic su "Invia esterno UpdatePanel" (attiva un normale postback). Nota in Fiddler il valore "foo=on" viene inviato nel corpo del POST.
  3. Fare clic su "Attiva/disattiva caselle di controllo" per disattivare la casella di controllo.
  4. Fare nuovamente clic su "Invia Outside UpdatePanel". Notare che il parametro "foo" viene omesso dal corpo POST. Questo è previsto.
  5. Fare clic su "Invia Inside UpdatePanel" (attiva un postback parziale).Notare il valore "foo=on" è presente nel corpo POST, anche se dovuto essere omessi

Il problema sembra essere in entrambi MicrosoftAjaxWebForms.js e MicrosoftMvcAjax.js (e la .debug controparti di ciascun):

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('&'); 
} 

l'attributo disabled sull'elemento viene serializzato c Completamente ignorato, andando contro le specifiche e il comportamento di fatto delle implementazioni di sottomissione dei moduli.

2

In .Net il tag del modulo ha l'attributo submitdisabledcontrols, che di default è false. Puoi almeno fare in modo che le cose si comportino in modo coerente se si imposta su true.

Problemi correlati