2013-01-23 27 views
11

Przede wszystkim, jedyny wpis (calling-multiple-dopostback-from-javascript), który znalazłem o tym nie pomógł mój problem, więc nie wierzę, że ten post jest duplikatem.JavaScript: Wiele parametrów w __doPostBack

mam tej funkcji JavaScript w mojej stronie ASPX, który obejmuje funkcję __doPostBack:

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

działa idealnie i mogę uzyskać wartość Bolid do mojego kodu za tak:

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

Problem polega na tym, że muszę przekazać 2 różne wartości przez odświeżenie. Czy są jakieś proste rozwiązania? Oczywiście coś takiego nie działa:

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

Każda pomoc będzie mile widziana.

Pozdrawiam, Gunnar

+0

@jbabey prawdopodobnie ma najłatwiejszą odpowiedź, ale nie jest też trudno przetasować własną funkcję "doPostBack".Wystarczy ustawić wartość kilku ukrytych pól wejściowych, a następnie przesłać formularz. Bardzo łatwe, nawet dla początkujących. – JDB

+0

@ Cyborgx37 yes, ukryte dane wejściowe to opcja, którą chciałbym zrealizować, jeśli (z jakiegoś dziwnego powodu) JSON nie wchodzi w grę. Ogólnie rzecz biorąc, nie powinieneś zamykać swojego HTMLa ukrytymi danymi wejściowymi, chyba że absolutnie musisz. – jbabey

+0

@jbabey Możesz użyć jQuery do utworzenia pól w DOM w razie potrzeby. Utrzymuje HTML w czystości. Alternatywnie możesz umieścić wartości w adresie URL, ale generalnie nie rozumiem tego podejścia dla żądania POST (co zazwyczaj używa WebForms). Twoje podejście jest prawdopodobnie tym, które polecam. – JDB

Odpowiedz

12

Ty mógł przejść dwie wartości jako jeden ciąg JSON:

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

I następnie zanalizować go na serwerze:

protected void UpdatePanelSearch_Load(object sender, EventArgs e) 
{ 
    SomeDTO deserializedArgs = 
     JsonConvert.DeserializeObject<SomeDTO>(Request["__EVENTARGUMENT"]); 
    var bolID = deserializedArgs.bolID; 
    var controlID = deserializedArgs.controlID; 
} 

public class SomeDTO 
{ 
    public string bolID { get; set; } 
    public string controlID { get; set; } 
} 

Jeśli używasz .Net> = 4.0, wierzę, że możesz przekształcić do postaci standardowej i uniknąć konieczności tworzenia SomeDTO. Edycja: More information about deserializing to dynamic types.

+0

To działało jak wdzięk, dzięki. Muszę bliżej przyjrzeć się JSON-owi, do tej pory nigdy go nie używałam w swoich projektach. Ponadto nie miałem zainstalowanego [Newtonsoft.Json framework] (http://nuget.org/packages/newtonsoft.json) w moim VS, ale to była łatwa łatwa. – Gunnar

2

użyłem wielu parametrów przed budując i dzielenie ciąg.

np

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

można następnie przekazać to do argumentów na odświeżenie, a podczas sprawdzania argumentów odświeżenie strony po prostu podzielić ciąg na podstawie swojej postaci speration (w tym przypadku „;”)

+1

jak wykonać 'String.Format' w javascript? : P – jbabey

+0

Nie jestem, po stronie C# serwera, gotowy do przechowywania w ukrytym polu, metody internetowej lub do konwersji na javascript. Po prostu i przykład :) – WraithNath

3

Rozważ umieszczenie danych w ukrytych polach po stronie serwera, a następnie odczytanie danych po odświeżeniu strony.

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

Skrypt klienta powinien zawierać wartości ID klienta, aby obsługiwać modyfikacje kontenera po stronie serwera. Używanie składni <%= expression %> (Kreator wyrażeń) wymaga zachowania skryptu (lub przynajmniej tej części skryptu) w pliku . Jeśli zachowujesz JavaScript w plikach zewnętrznych, możesz "zarejestrować" prostą funkcję, która zostanie wywołana przez twój główny JavaScript, aby przenieść dane i skomponować tę stronę serwera funkcji wraz z wymaganym ClientIDs. Zobacz ClientScriptManager.RegisterClientScriptBlock().

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

Serwer kodu po stronie następnie wygląda następująco:

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

pewnością istnieją inne techniki, przekazując wiele wartości danych, ale znalazłem to być zarówno proste i łatwe w utrzymaniu. W razie potrzeby możesz przekazywać wszystkie rodzaje danych i kodować je za pomocą JSON.