2013-05-03 26 views
5

Próbuję użyć funkcji __doPostBack, więc mogę zmusić moją stronę do post pack na ładowanie strony, ale mam pewne trudności ze zrozumieniem.Jak korzystać z funkcji __doPostBack w asp.net

kiedy oglądałem przykłady online. Kliknij przycisk, chcę zrobić post, ale nie wiem, jak wypełnić kod w kodzie.

Oto co mam do tej pory:

<script type="text/javascript"> 
     function DoPostBack() { 
      __doPostBack('btnNew', 'MyArgument'); 
     } 
    </script> 

Oto mój przycisk

<asp:Button ID="btnNew" runat="server" CausesValidation="False" CommandName="New" OnClick="DoPostBack()" Text="Create" /> 

I nie wydają się zrozumieć używać "MyArgument" w kodzie tyłu. Co muszę zrobić w tym kodzie, aby był on wysyłany ponownie po wczytaniu strony? z góry dziękuję za pomoc.

+1

po prostu nie rozumiem, dlaczego używasz __doPostBack w JavaScript, jeśli przycisk mimo to powoduje zwrot? – Alexan

+0

Jaki jest powód napisania własnego skryptu odświeżania dla kontrolki przycisku (który jest publikowany tak jak Alex stwierdził)? – Win

+0

Czy chcesz wykonać PostBack dla przycisku OnClick? To jest uruchamiane automatycznie. Nie musisz dodawać do niego dodatkowego kodu. –

Odpowiedz

2

Wartości przekazywane do funkcji __doPostBack jako argumenty będą wysyłane na serwer jako parametry żądania o nazwach __EVENTTARGET i __EVENTARGUMENT. ASP.NET używa tych wartości do określenia, które sterowanie wywołało zdarzenie i jakie argumenty powinny zostać przekazane jako obiekt EventArgs. Ale można do nich dostęp bezpośrednio z obiektu HttpRequest:

string eventTarget = this.Request.Params.Get("__EVENTTARGET"); 
string eventArgument = this.Request.Params.Get("__EVENTARGUMENT"); 
+0

czy muszę umieścić ten kod w metodzie ładowania strony? – moe

+0

@moe, niekoniecznie. O ile mi wiadomo, obiekt żądania jest dostępny przez cały cykl życia strony. – Andrei

4

Scenariusz 1

Jeśli chcesz korzystać z funkcji JavaScript wyzwolić odświeżenie strony, trzeba wymienić OnClick z OnClientClick. Zmienić definicję przycisk tak (ja już jestem przy założeniu, że jest zagnieżdżona wewnątrz UpdatePanel):

<asp:Button ID="btnNew" 
    runat="server" 
    CausesValidation="False" 
    CommandName="New" 
    OnClientClick="DoPostBack();" 
    Text="Create" /> 

W kodzie tyłu w sposobie Page_Load przeczytać Request["__EVENTTARGET"] i Request["__EVENTARGUMENT"]:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     if (Request["__EVENTTARGET"] == "btnNew" && 
      Request["__EVENTARGUMENT"] == "MyArgument") 
     { 
      //do something 
     } 
    } 
} 

Scenariusz 2

Jeśli nie koniecznie chcesz używać JavaScript , Zmodyfikować definicję Buttona tak:

<asp:Button ID="btnNew" 
    runat="server" 
    CausesValidation="False" 
    CommandName="New" 
    OnClick="DoPostback" 
    CommandArgument="MyArgument" 
    Text="Create" /> 

Następnie dodaj następującą metodę w kodzie za:

protected void DoPostback(object sender, EventArgs e) 
{ 
    var target = ((Button)(sender)).ClientID; //"btnNew" 
    var argument = ((Button)(sender)).CommandArgument; //"MyArgument" 
    if (target == "btnNew" && 
     argument == "MyArgument") 
    { 
     //do something 
    } 
} 
1

ASP.Net zapewnia sposób, aby budować połączenia do wykonywania PostBack od javascript.

ClientScriptManager.GetPostBackEventReference Metoda zbuduje kod trzeba użyć javascript, aby wykonać PostBack od konkretnej kontroli http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.getpostbackeventreference.aspx

Poniżej jest przykład (w Vb.NET). W kodzie źródłowym tworzę własną funkcję javascript. Kod ASP.Net wstawi kod javascript do mojej funkcji, aby wykonać PostBack dla kontrolki "MyButton". Kiedy strona zostanie zbudowana, ta funkcja javascript będzie dostępna.Kiedy kod javascript nawiąże połączenie z tą funkcją javascript, wykona PostBack, który będzie naśladować działanie, które ma miejsce po kliknięciu przycisku "MyButton".

Dim csm As ClientScriptManager = Page.ClientScript 
Dim sb As New StringBuilder 
sb.AppendLine("function handleDoPostBack() {") 
sb.AppendLine(csm.GetPostBackEventReference(MyButton, "")) 
sb.AppendLine("}") 
csm.RegisterClientScriptBlock(Me.Page.GetType, "js_code__create_functions", sb.ToString, True) 

Mam nadzieję, że tego właśnie szukasz.

UPDATE

Oto przykład, w jaki sposób można wywołać funkcję JavaScript, który został stworzony dla Ciebie po stronie serwera.

<input type="button" value="Click Me" onclick="handleDoPostBack();" /> 

Zrobiłem zwykły przycisk HTML (zamiast przy użyciu przycisku ASP.NET), bo nie chcą się pojęcie odświeżenie strony przycisku mylić z nim. Jest to po prostu przycisk HTML, który nie robi nic poza tym, co programujesz. Ponieważ dodałem wywołanie funkcji javascript do onclick, po naciśnięciu przycisku wykona on PostBack. Kiedy pojawi się PostBack, działa tak, jakby kliknął przycisk "MyButton"; to byłby przycisk ASP.Net, który masz gdzieś na stronie. Ponieważ ten przycisk jest przyciskiem ASP.Net, już wcześniej wykonałby PostBack, dlatego myślę, że istnieje pewne zamieszanie związane z programowaniem programu PostBack.

Można również wywołać funkcję javascript bezpośrednio w kodzie jako takie ...

<script> 
handleDoPostBack(); 
</script> 

to nastąpi tak szybko, jak kod napotyka go. Lub, jeśli umieścisz go w zdarzeniu onload, zostanie ono wywołane po zakończeniu ładowania strony. Ale, jak wspomniałem w swoim komentarzu, musisz być ostrożny, ponieważ możesz skończyć z pętlą inifinite.

Po przeczytaniu niektórych komentarzy w innych odpowiedziach, problem, który próbujesz rozwiązać, wydaje się mieć związek z panelami AJAX, z których korzystasz. Nie jestem z nich znany, więc nie jestem pewien, dlaczego to nie działa, i nie wiem, czy uruchomienie programu PostBack ma rozwiązać problem.

Jednakże, jeśli trzeba programowo wyzwolić PostBack, jest to kod, którego można użyć. Używam go w przypadkach, w których nie chcę, aby przycisk był na stronie, ale chcę, aby miała miejsce akcja. Kiedy na mojej stronie dzieje się coś jeszcze, uruchamiam kod javascript, który działa tak, jakby kliknięto przycisk - i mogę obsłużyć ten przycisk po stronie serwera. Na mojej stronie ASP.Net uwzględniam przycisk, ale potem używam CSS, aby ukryć użytkownika przed wyświetleniem przycisku. Tak więc użytkownik nie widzi przycisku, ale mój kod javascript może wywoływać moją funkcję javacript, która będzie naśladować kliknięcie tego przycisku.

+0

dzięki Rick. Nie mogę wydawać się postępować zgodnie z kodem, doceń, jeśli potrafisz rozwinąć przykład. wszystko, co próbuję zrobić kolejny odświeżenie po kliknięciu przycisku. – moe

+0

Po prostu ponownie przeczytałem twoje pytanie, aby dowiedzieć się, jak zaimplementować ten kod i przyłapać się na tym, jak to zrobić na ładowaniu strony. Więc kiedy strona się ładuje, chcesz automatycznie zrobić PostBack? Czy to jest poprawne? Jeśli tak, musisz być ostrożny z tym, b/c Myślę, że mógłbyś wprowadzić cię w nieskończoną pętlę; jeśli chcesz załadować stronę, zamieścić ją ponownie, wczytać stronę ponownie, opublikować ponownie itp. Jaki jest Twój cel w próbie zmuszenia PostBack? Powyższy komentarz wspomina PostBack o kliknięciu przycisku, dlatego zostałem zdezorientowany. – Rick

+0

Chcę spróbować podejścia, ale nie wiem, jak go przestrzegać i wypróbować. tutaj jest moje pytanie, gdzie jest javascript i gdzie muszę umieścić ten kod na metodę przycisku lub obciążenia strony, dlatego jestem zdezorientowany, jak go wypróbować i zobaczyć, czy to działa. Jestem na to nowy, więc proszę wybaczyć mój brak umiejętności w tej dziedzinie. dzięki. – moe

1

poniższy kod działa dla mnie do odświeżenia strony za pomocą C#. Uwaga Nie używam parametr 'MyArgument' i pozostawiając pustą

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "DoPostBack", "__doPostBack('dummybtnPivotGridupdate', '')", true); 

gdzie

<asp:Button ID="dummybtnPivotGridupdate" runat="server" Style="display: none;" ClientIDMode="Static" /> 

Nadzieja to pomaga!