Call ASP.NET funkcja z JavaScript?

Piszę stronę w ASP.NET. mam trochę kodu JavaScript, i mam przycisk submit z click event.

Czy jest możliwe wywołanie metody, którą stworzyłem w ASP z JavaScript ' s click event?

Author: Peter Mortensen, 2008-08-06

20 answers

Cóż, jeśli nie chcesz tego robić za pomocą Ajax lub w jakikolwiek inny sposób i po prostu chcesz normalnego ASP.NET postback to happen, oto jak to zrobić (bez użycia innych bibliotek):

jest to jednak trochę trudne... :)

I. w pliku kodu (zakładając, że używasz C# i. NET 2.0 lub nowszych) Dodaj następujący interfejs do swojej klasy Page, aby wyglądał jak

public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}

Ii. należy dodać (używając zakładki -Tab ) Ta funkcja do Twojego kodu plik:

public void RaisePostBackEvent(string eventArgument) { }

Iii. w zdarzeniu onclick w JavaScript wpisz następujący kod:

var pageId = '<%=  Page.ClientID %>';
__doPostBack(pageId, argumentString);

Spowoduje to wywołanie metody 'RaisePostBackEvent' w pliku kodu z 'eventArgument' jako 'argumentString' przekazanym z JavaScript. Teraz możesz zadzwonić do każdego innego wydarzenia, które lubisz.

P. S: to jest "podkreślenie-podkreślenie-doPostBack"... I nie powinno być miejsca w tej sekwencji... Jakoś WMD nie pozwala mi pisać do charakter!

 94
Author: Adhip Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 17:26:30

Metoda __doPostBack() działa dobrze.

Innym rozwiązaniem (bardzo hackish) jest po prostu dodać niewidoczny przycisk ASP w znacznikach i kliknąć go metodą JavaScript.

<div style="display: none;">
   <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>

Z twojego JavaScript, Pobierz odniesienie do przycisku za pomocą ClientID , a następnie wywołaj .click() metoda na nim.

var button = document.getElementById(/* button client id */);

button.click();
 59
Author: mbillard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 17:27:44

Microsoft AJAX library osiągnie to. Możesz również stworzyć własne rozwiązanie, które polega na użyciu Ajaxu do wywoływania własnych plików skryptów aspx (w zasadzie) do uruchamiania funkcji. NET.

Proponuję bibliotekę Microsoft AJAX. Po zainstalowaniu i odwołaniu, po prostu dodaj wiersz w ładowaniu strony lub init:

Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))

Wtedy możesz robić takie rzeczy jak:

<Ajax.AjaxMethod()> _
Public Function Get5() AS Integer
    Return 5
End Function

Następnie możesz nazwać go na swojej stronie jako:

PageClassName.Get5(javascriptCallbackFunction);

Ostatni parametr wywołania funkcji musi być funkcją zwrotną javascript, która zostanie wykonana po zwróceniu żądania AJAX.

 18
Author: EndangeredMassa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 20:14:51

Możesz to zrobić asynchronicznie używając. NET Ajax PageMethods. Zobacz tutaj lub Tutaj .

 11
Author: brendan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-18 18:47:22

Myślę, że blog post Jak pobrać i pokazać dane bazy danych SQL Server w ASP.NET strona wykorzystująca Ajax (jQuery) pomoże Ci.

Kod JavaScript

<script src="http://code.jquery.com/jquery-3.3.1.js" />
<script language="javascript" type="text/javascript">

    function GetCompanies() {
        $("#UpdatePanel").html("<div style='text-align:center; background-color:yellow; border:1px solid red; padding:3px; width:200px'>Please Wait...</div>");
        $.ajax({
            type: "POST",
            url: "Default.aspx/GetCompanies",
            data: "{}",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: OnSuccess,
            error: OnError
        });
    }

    function OnSuccess(data) {
        var TableContent = "<table border='0'>" +
                                "<tr>" +
                                    "<td>Rank</td>" +
                                    "<td>Company Name</td>" +
                                    "<td>Revenue</td>" +
                                    "<td>Industry</td>" +
                                "</tr>";
        for (var i = 0; i < data.d.length; i++) {
            TableContent += "<tr>" +
                                    "<td>"+ data.d[i].Rank +"</td>" +
                                    "<td>"+data.d[i].CompanyName+"</td>" +
                                    "<td>"+data.d[i].Revenue+"</td>" +
                                    "<td>"+data.d[i].Industry+"</td>" +
                                "</tr>";
        }
        TableContent += "</table>";

        $("#UpdatePanel").html(TableContent);
    }

    function OnError(data) {

    }
</script>

ASP.NET Funkcja Po stronie serwera

[WebMethod]
[ScriptMethod(ResponseFormat= ResponseFormat.Json)]
public static List<TopCompany> GetCompanies()
{
    System.Threading.Thread.Sleep(5000);
    List<TopCompany> allCompany = new List<TopCompany>();
    using (MyDatabaseEntities dc = new MyDatabaseEntities())
    {
        allCompany = dc.TopCompanies.ToList();
    }
    return allCompany;
}
 5
Author: SRV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 12:52:35

Statyczne, silnie pisane programowanie zawsze wydawało mi się bardzo naturalne, więc na początku opierałem się nauce JavaScript (nie wspominając o HTML i CSS), kiedy musiałem tworzyć webowe front-endy Dla Moich aplikacji. Zrobiłbym wszystko, aby obejść to, jak przekierowanie na stronę, aby wykonać i wykonać akcję na zdarzeniu OnLoad, o ile mógłbym kodować czysty C#.

Przekonasz się jednak, że jeśli zamierzasz pracować ze stronami internetowymi, musisz mieć otwarty umysł i zacząć myśleć więcej web-oriented (czyli nie próbuj robić rzeczy po stronie klienta na serwerze i odwrotnie). Kocham ASP.NET webforms i nadal go używać( jak również MVC), ale powiem, że próbując uprościć sprawy i ukrywając oddzielenie klienta od serwera, może to mylić nowicjuszy i faktycznie skończyć się utrudniając rzeczy czasami.

Radzę nauczyć się podstaw JavaScript (jak rejestrować zdarzenia, pobierać obiekty DOM, manipulować CSS, itp.) i znajdziesz www programowanie o wiele przyjemniejsze (nie wspominając o łatwiejszym). Wiele osób wspomniało o różnych bibliotekach Ajax, ale nie widziałem żadnych rzeczywistych przykładów Ajaxu, więc proszę bardzo. (Jeśli nie jesteś zaznajomiony z Ajaxem, wszystko, co jest, jest wykonanie asynchronicznego żądania HTTP w celu odświeżenia zawartości (lub może wykonać akcję po stronie serwera w swoim scenariuszu) bez przeładowywania całej strony lub robienia pełnego postback.

Client-Side:

<script type="text/javascript">
var xmlhttp = new XMLHttpRequest(); // Create object that will make the request
xmlhttp.open("GET", "http://example.org/api/service", "true"); // configure object (method, URL, async)
xmlhttp.send(); // Send request

xmlhttp.onstatereadychange = function() { // Register a function to run when the state changes, if the request has finished and the stats code is 200 (OK). Write result to <p>
    if (xmlhttp.readyState == 4 && xmlhttp.statsCode == 200) {
          document.getElementById("resultText").innerHTML = xmlhttp.responseText;
    }
};
</script>
To wszystko. Chociaż nazwa może wprowadzać w błąd wynik może być również w postaci zwykłego tekstu lub JSON, nie ograniczasz się do XML. jQuery zapewnia jeszcze prostszy interfejs do wykonywania połączeń Ajax (wśród upraszczania innych zadań JavaScript).

Żądanie może być HTTP-POST lub HTTP-GET i nie musi być na stronie internetowej, ale można je wysyłać do dowolnej usługi, która nasłuchuje żądań HTTP, takich jak API RESTful . Na ASP.NET MVC 4 Web API sprawia, że skonfigurowanie usługi internetowej po stronie serwera do obsługi żądania również jest proste. Ale Wiele osób nie wie, że można również dodawać Kontrolery API do projektu formularzy internetowych i używać ich do obsługi takich wywołań Ajax.

Server-Side:

public class DataController : ApiController
{
    public HttpResponseMessage<string[]> Get()
    {
        HttpResponseMessage<string[]> response = new HttpResponseMessage<string[]>(
            Repository.Get(true),
            new MediaTypeHeaderValue("application/json")
        );

        return response;
    }
}

Global.asax

Następnie po prostu zarejestruj trasę HTTP w swojej globalnej.plik asax, więc ASP.NET będzie wiedział, jak skierować wniosek.

void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}");
}

Z AJAX i kontrolerów, można wysyłać z powrotem do serwera w dowolnym momencie asynchronicznie wykonać dowolną operację po stronie serwera. Ten jeden-dwa cios zapewnia zarówno elastyczność JavaScript jak i moc C # / ASP.NET, dając ludziom odwiedzającym Twoją witrynę lepsze ogólne wrażenia. Bez poświęcania czegokolwiek, dostajesz to, co najlepsze z obu światów.

Referencje

 4
Author: Despertar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 17:04:26

Osiągnie to biblioteka Microsoft AJAX. Możesz również stworzyć własne rozwiązanie, które polega na użyciu Ajaxu do wywoływania własnych plików skryptów aspx (w zasadzie) do uruchamiania funkcji. NET.

Jest to biblioteka o nazwie AjaxPro, która została napisana MVP o imieniu Michael Schwarz . To była biblioteka nie została napisana przez Microsoft.

Używałem ajaxpro szeroko i jest to bardzo fajna biblioteka, którą polecam do prostych wywołań zwrotnych na serwer. Informatyka działa dobrze z wersją Ajax firmy Microsoft bez żadnych problemów. Chciałbym jednak zauważyć, jak łatwo Microsoft uczynił Ajax, używam go tylko wtedy, gdy jest to naprawdę konieczne. Potrzeba dużo JavaScript, aby zrobić naprawdę skomplikowaną funkcjonalność, którą otrzymujesz od Microsoftu, po prostu upuszczając ją do panelu aktualizacji.

 3
Author: David Basarab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 17:47:35

Jest to bardzo proste dla obu scenariuszy (tzn. synchroniczne/asynchroniczne), jeśli chcesz uruchomić obsługę zdarzeń po stronie serwera, na przykład zdarzenie kliknięcia przycisku.

Do wyzwalania obsługi zdarzeń kontrolki: Jeśli dodałeś już ScriptManager na swojej stronie, pomiń krok 1.

  1. Dodaj następujący tekst w sekcji skrypt klienta strony

    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>
    
    1. Zapisanie obsługi zdarzeń po stronie serwera dla twojej kontroli

      Protected void btnSayHello_Click(object nadawca, EventArgs e) { Label1.Tekst = "Hello World",.."; }

    2. Dodaj funkcję klienta do wywołania obsługi zdarzeń po stronie serwera

      Funkcja SayHello() { __doPostBack ("btnSayHello", ""); }

Zastąp "btnSayHello" w powyższym kodzie identyfikatorem klienta kontrolera.

W ten sposób, jeśli kontrolka znajduje się w panelu aktualizacji, strona nie zostanie odświeżona. To takie proste.

Jeszcze jedno: uważaj z client id, bo to zależy od Ciebie ID-generation policy zdefiniowanej za pomocą właściwości ClientIDMode.

 2
Author: Behnam Esmaili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 17:48:56
Próbuję to zaimplementować, ale to nie działa dobrze. Strona jest odpisuję, ale mój kod nie jest wykonywany. Kiedy debuguję page, the RaisePostBackEvent nigdy nie zostanie zwolniony. Jedno zrobiłem inaczej jest to, że robię to w user control zamiast aspx strona.
Jeśli ktoś jeszcze jest jak Merk, i ma problemy z przyjściem tego, mam rozwiązanie: {]}

Gdy masz kontrolę użytkownika, wydaje się, że musisz również utworzyć PostBackEventHandler w Strona nadrzędna. Następnie możesz wywołać kontrolkę użytkownika PostBackEventHandler, wywołując ją bezpośrednio. Patrz poniżej:

public void RaisePostBackEvent(string _arg)
{
    UserControlID.RaisePostBackEvent(_arg);
}

Gdzie UserControlID jest identyfikatorem, który nadałeś użytkownikowi na stronie nadrzędnej, gdy zagnieżdżałeś go w znaczniku.

Uwaga: Możesz również po prostu wywołać bezpośrednio metody należące do tej kontroli użytkownika (w takim przypadku potrzebujesz tylko obsługi raisepostbackevent na stronie nadrzędnej):

public void RaisePostBackEvent(string _arg)
{
    UserControlID.method1();
    UserControlID.method2();
}
 2
Author: davrob01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 17:04:46

Możesz chcieć utworzyć usługę internetową dla swoich popularnych metod.
Wystarczy dodać WebMethodAttribute nad funkcjami, które chcesz wywołać, i to wszystko.
Posiadanie usługi internetowej ze wszystkimi typowymi rzeczami również ułatwia utrzymanie systemu.

 1
Author: Lars Mæhlum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 18:15:19

Jeśli funkcja _ _ doPostBack nie jest wygenerowana na stronie, musisz wstawić kontrolkę, aby wymusić ją tak:

<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
 1
Author: Riga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 07:47:32

Odnośnie:

var button = document.getElementById(/* Button client id */);

button.click();

Powinno być tak:

var button = document.getElementById('<%=formID.ClientID%>');

Gdzie formID jest ASP.NET identyfikator kontrolny w .plik aspx.

 1
Author: KDJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 18:25:41

Dodaj tę linię do ładowania strony, Jeśli otrzymujesz błąd oczekiwany przez obiekt.

ClientScript.GetPostBackEventReference(this, "");
 0
Author: Shuja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 13:11:19

Możesz użyć PageMethods.Your C# method Name aby uzyskać dostęp do metod C # lub VB.NET metody do JavaScript.

 0
Author: kakani santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 17:48:21

Spróbuj tego:

if(!ClientScript.IsStartupScriptRegistered("window"))
{
    Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true);
}

Lub to

Response.Write("<script>alert('Hello World');</script>");

Użyj właściwości OnClientClick przycisku, aby wywołać funkcje JavaScript...

 0
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 18:21:49

Możesz go również uzyskać, dodając tę linię w kodzie JavaScript:

document.getElementById('<%=btnName.ClientID%>').click()
Myślę, że to bardzo proste!
 0
Author: The Hungry Dictator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 18:22:35

Proszę spróbować:

<%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>;

Ddlvouchertype jest kontrolką, którą wywoła wybrana zmiana indeksu... I możesz umieścić dowolną funkcję na wybranej zmianie indeksu tej kontroli.

 0
Author: Sumit Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 18:26:18

Najprostszym i najlepszym sposobem na osiągnięcie tego celu jest użycie zdarzenia onmouseup() JavaScript zamiast onclick()

W ten sposób uruchomisz JavaScript po kliknięciu i nie będzie to zakłócać zdarzenia ASP OnClick().

 0
Author: 6134548,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 18:27:27

Próbuję tego i mogę uruchomić Asp.Net metoda podczas korzystania z jQuery.

  1. Zrób przekierowanie strony w kodzie jQuery

    window.location = "Page.aspx?key=1";
    
  2. Następnie użyj ciągu zapytania w ładowaniu strony

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["key"] != null)
        {
            string key= Request.QueryString["key"];
            if (key=="1")
            {
                // Some code
            }
        }
    }
    

Więc nie trzeba uruchamiać dodatkowego kodu

 0
Author: mrbengi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-15 18:13:17

Ta odpowiedź działa jak bryza dla mnie dzięki cross browser:

Metoda _ _ doPostBack() działa dobrze.

Innym rozwiązaniem (bardzo hackish) jest po prostu dodać niewidoczny przycisk ASP w znacznikach i kliknąć go metodą JavaScript.

<div style="display: none;"> 
    <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" /> 
</div> 

Z twojego JavaScript, Pobierz odniesienie do przycisku za pomocą jego ClientID, a następnie wywołaj .Metoda Click ():

var button = document.getElementByID(/* button client id */); 

button.Click(); 

Blockquote

 0
Author: Ananda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 17:03:37