2013-01-23 21 views
11

Prima di tutto, l'unico post (calling-multiple-dopostback-from-javascript) trovato in questo non ha aiutato il mio problema, quindi non credo che questo post sia un duplicato.JavaScript: più parametri in __doPostBack

Ho questa funzione JavaScript nella mia pagina web ASPX che include una funzione di __doPostBack:

function OpenSubTable(bolID, controlID) { 
    // code 
    __doPostBack('UpdatePanelSearch', bolID); 
    // more code 
} 

funziona perfettamente e posso ottenere il valore di BOLID nel mio codice dietro in questo modo:

protected void UpdatePanelSearch_Load(object sender, EventArgs e) 
{ 
    var bolID = Request["__EVENTARGUMENT"]; 
    // code 
} 

Il problema è che devo passare 2 valori diversi attraverso il postback. Ci sono soluzioni semplici a questo? Ovviamente qualcosa del genere non funziona:

function OpenSubTable(bolID, controlID) { 
    // code 
    __doPostBack('UpdatePanelSearch', bolID, controlID); // not that simple, i'm afraid :(
    // more code 
} 

Qualsiasi aiuto sarebbe il benvenuto.

saluti, Gunnar

+0

@jbabey probabilmente ha la risposta più semplice, ma non è nemmeno difficile eseguire la propria funzione "doPostBack".Tutto ciò che deve fare è impostare il valore di un paio di campi di input nascosti e quindi inviare il modulo. Molto facile, anche per un principiante. – JDB

+0

@ Cyborgx37 sì, gli input nascosti sono l'opzione che vorrei perseguire se (per qualche strana ragione) JSON sia fuori questione. In generale, non si vuole confondere il codice HTML con input nascosti a meno che non sia assolutamente necessario. – jbabey

+0

@jbabey È possibile utilizzare jQuery per creare i campi nel DOM secondo necessità. Mantiene pulito il tuo HTML. In alternativa è possibile inserire valori nell'URL, ma in genere disapprovo tale approccio per una richiesta POST (che è generalmente utilizzata da WebForm). Il tuo approccio è ancora probabilmente quello che raccomanderei. – JDB

risposta

12

si potrebbe passare i due valori come stringa di un JSON:

function OpenSubTable(bolID, controlID) { 
    __doPostBack('UpdatePanelSearch', JSON.stringify({ bolID: bolID, controlID: controlID})); 
} 

E poi analizzarlo sul server:

Se si utilizza .Net> = 4.0, credo che è possibile deserializzare in una touple generica ed evitare di dover creare SomeDTO. Modifica: More information about deserializing to dynamic types.

+0

Questo ha funzionato come un fascino, grazie. Devo dare un'occhiata più da vicino a JSON, non l'ho mai usato nei miei progetti fino ad ora. Inoltre, non avevo il [framework Newtonsoft.Json] (http://nuget.org/packages/newtonsoft.json) installato nel mio VS, ma era una soluzione semplice. – Gunnar

2

ho utilizzato diversi parametri, prima con la costruzione e la suddivisione di un testo.

esempio

string args = String.Format("{0};{1}", bolID, ControlID); 

si può quindi passare questo per gli argomenti per il postback, e durante il controllo per gli argomenti di postback basta dividere la stringa in base al personaggio speration (in questo caso ';')

+1

come stai eseguendo 'String.Format' in javascript? : P – jbabey

+0

Im non, il suo lato server C#, pronto per essere memorizzato in un campo nascosto, metodo web o per essere convertito in javascript. Proprio ed esempio :) – WraithNath

3

Considerare l'immissione dei dati nei campi nascosti lato server e quindi la lettura di tali dati dopo il postback.

<asp:HiddenField id="Data1HiddenField" runat="server" /> 
<asp:HiddenField id="Data2HiddenField" runat="server" /> 

Lo script client deve includere i valori ClientID per gestire le modifiche del contenitore di denominazione lato server. L'utilizzo della sintassi <%= expression %> (Expression Builder) richiede che lo script (o almeno questa parte dello script) sia mantenuto all'interno del file .aspx. Se mantieni il tuo JavaScript in file esterni, puoi "registrare" una semplice funzione che viene chiamata dal tuo JavaScript principale per spostare i dati e comporre quel lato del server di funzioni insieme allo ClientIDs richiesto. Vedi ClientScriptManager.RegisterClientScriptBlock().

var data1 = "data value 1"; 
var data2 = "data value 2"; 
$("#<%= Data1HiddenField.ClientID %>").val(data1); 
$("#<%= Data2HiddenField.ClientID %>").val(data2); 

Il codice lato server appare allora come questo:

string data1 = Data1HiddenField.Value; 
string data2 = Data2HiddenField.Value; 

Ci sono certamente altre tecniche per passare più valori di dati, ma ho trovato questo per essere semplice e facile da mantenere. È possibile passare tutti i tipi di dati e codificarli utilizzando JSON se necessario.