Cominciando a sviluppare pagine con Ajax mi sono spesso imbattuto in questo tipo di errore:image

Bhé la soluzione era abbastanza chiara, ma il motivo e soprattutto le implicazioni che portava tale soluzione non mi erano chiare. Ed ecco che mi sono messo a studiare un po' più a fondo il problema:

Lo scenario è semplice:

  1. Creare una drop down server side
  2. Un altro elemento della webform effettua una chiamata asincrona e restituisce dei dati
  3. Questi dati vengono utilizzati per popolare la drop down
  4. La pressione di un pulsante che effettua un postback genera l'errore mostrato qui sopra.

Il problema risiede nel fatto che asp.net tenta di controllare i dati postati con la drop down confrontandoli con quelli che erano stati spediti durante la prima richiesta e si "accorge" che i dati postati non sono quelli che erano stati inviati.

Ci sono diversi metodi per risolvere il problema:

  1. Settare la proprietà EnableEventValidation a false (possibili problemi di sicurezza).
  2. Nel metodo Render della pagina è possibile definire quali siano i valori validi per i controlli in oggetto, il problema è che tali valori vengono aggiuntu alla viewstate e nel caso di un numero elevato di valori accettabili, i dati trasferiti al client potrebbero essere "troppi"
    protected override void Render(HtmlTextWriter writer) {
       ClientScript.RegisterForEventValidation(
          this.ddlName.UniqueID, "Fred Smith");
       ClientScript.RegisterForEventValidation(
          this.ddlName.UniqueID, String.Empty);
       base.Render(writer);
    }
  3. Invece di utilizzare un controllo server ASP.Net è possibile usare un controllo HtmlControl. Tali controlli non mantengono lo stato tra i diversi postback in Ajax.

Technorati Tags: ,