Вызов функции ASP.NET из JavaScript?

Я пишу веб-страницу в ASP.NET. У меня есть некоторый код JavaScript, и у меня есть кнопка отправки с событием щелчка.

Можно ли вызвать метод, который я создал в ASP, с помощью события click в JavaScript?

6.08.2008 17:16:36
Вы должны использовать библиотеку Ajax, например: Anthem
jdecuyper 6.08.2008 17:18:16
20 ОТВЕТОВ
РЕШЕНИЕ

Ну, если вы не хотите делать это с помощью Ajax или любым другим способом и просто хотите, чтобы произошла обычная обратная передача ASP.NET, вот как вы это делаете (без использования каких-либо других библиотек):

Это немного сложно, хотя ... :)

я. В своем файле кода (при условии, что вы используете C # и .NET 2.0 или более позднюю версию) добавьте следующий интерфейс к своему классу Page, чтобы он выглядел как

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

II. Это должно добавить (используя Tab- Tab) эту функцию в ваш файл кода:

public void RaisePostBackEvent(string eventArgument) { }

III. В своем событии onclick в JavaScript напишите следующий код:

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

Это вызовет метод RaisePostBackEvent в вашем кодовом файле с аргументом eventArgument в качестве аргументаString, который вы передали из JavaScript. Теперь вы можете назвать любое другое событие, которое вам нравится.

PS: Это 'underscore-underscore-doPostBack' ... И в этой последовательности не должно быть пробелов ... Каким-то образом ОМУ не позволяет мне писать в подчеркиваниях, за которыми следует символ!

92
9.12.2016 17:26:30
Я пытаюсь реализовать это, но это не работает правильно. Страница отправляется обратно, но мой код не выполняется. Когда я отлаживаю страницу, RaisePostBackEvent никогда не запускается. Одна вещь, которую я сделал по-другому, я делаю это в пользовательском элементе управления, а не на странице aspx.
merk 23.09.2011 19:29:20
это дает мне ошибку говорит объект ожидается. Я назвал это так:window.onbeforeunload = confirmExit; //debugger; function confirmExit() { var pageId = '<%= Page.ClientID %>'; var argumentString = 'ReleaseLock'; __doPostBack(pageId, argumentString); }
Pavitar 29.03.2012 05:22:54
По какой-то причине я не мог заставить его работать с onkeyupсобытием. Есть JavaScript runtime error: '__doPostBack' is undefined. Я использую C # и ASP.NET 2.0.
Andrew T. 10.04.2015 03:56:09

Вы можете сделать это асинхронно, используя .NET Ajax PageMethods. Смотрите здесь или здесь .

11
9.12.2016 17:27:02

Библиотека Microsoft AJAX выполнит это. Вы также можете создать собственное решение, использующее AJAX для вызова собственных файлов сценариев aspx (как в основном) для запуска функций .NET.

Я предлагаю библиотеку Microsoft AJAX. После установки и ссылки вы просто добавляете строку в страницу загрузки или инициализации:

Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))

Тогда вы можете делать такие вещи, как:

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

Затем вы можете назвать его на своей странице как:

PageClassName.Get5(javascriptCallbackFunction);

Последний параметр вашего вызова функции должен быть функцией обратного вызова javascript, которая будет выполняться при возврате запроса AJAX.

18
17.02.2011 20:14:51

Возможно, вы захотите создать веб-сервис для ваших общих методов.
Просто добавьте атрибут WebMethodAttribute поверх функций, которые вы хотите вызвать, и это все.
Наличие веб-службы со всеми вашими общими вещами также облегчает обслуживание системы.

1
11.08.2008 18:15:19

__doPostBack()Метод хорошо работает.

Другое решение (очень хакерское) - просто добавить невидимую кнопку ASP в разметку и щелкнуть по ней методом JavaScript.

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

Из вашего JavaScript получите ссылку на кнопку, используя ее ClientID, а затем вызовите метод .click () для нее.

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

button.click();
58
9.12.2016 17:27:44
Что делать, если я хочу использовать аргумент? Могу ли я получить его со стороны клиента и использовать его с button.Click ()?
Kubi 29.03.2010 07:02:06
@Kubi аргумент на стороне сервера? Обычно я сериализирую аргументы, которые необходимо отправить на сервер, и помещаю их в скрытое поле.
mbillard 29.03.2010 14:13:25
не могли бы вы посмотреть здесь? stackoverflow.com/questions/2536106/…
Kubi 29.03.2010 16:28:09
существует метод Click ??
Saher Ahwal 16.07.2010 14:09:24
@saher да, но это на самом деле .click (строчная буква c) ( comptechdoc.org/independent/web/cgi/javamanual/javabutton.html )
mbillard 16.07.2010 15:38:42

Библиотека Microsoft AJAX выполнит это. Вы также можете создать собственное решение, использующее AJAX для вызова собственных файлов сценариев aspx (как в основном) для запуска функций .NET.

Это библиотека под названием AjaxPro, которая была написана MVP по имени Майкл Шварц . Эта библиотека не была написана Microsoft.

Я широко использовал AjaxPro, и это очень хорошая библиотека, которую я бы порекомендовал для простых обратных вызовов на сервер. Это работает хорошо с версией Microsoft Ajax без проблем. Тем не менее, я хотел бы заметить, с тем, как легко Microsoft сделала Ajax, я бы использовал его только в случае крайней необходимости. Для выполнения действительно сложной функциональности, которую вы получаете от Microsoft, требуется много JavaScript, просто поместив его в панель обновлений.

3
9.12.2016 17:47:35
Хотелось бы, чтобы этот пост был ближе к тому, что был выше ... Я просидел несколько минут, пытаясь выяснить, почему этот метод нигде не упоминается в документации MS: /
Dave Swersky 16.07.2009 16:37:54
@Dave Вот почему люди должны комментировать ответы, а не добавлять комментарии к другим ответам как уникальные ответы.
Charles Boyung 30.06.2010 19:22:43

Этот ответ работает как ветер для меня благодаря кросс-браузер:

Метод __doPostBack () работает хорошо.

Другое решение (очень хакерское) - просто добавить невидимую кнопку ASP в разметку и щелкнуть по ней методом JavaScript.

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

Из вашего JavaScript извлеките ссылку на кнопку, используя ее ClientID, а затем вызовите для нее метод .Click ():

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

button.Click(); 

Blockquote

0
22.02.2018 17:03:37

Если функция __doPostBack не сгенерирована на странице, вам нужно вставить элемент управления, чтобы принудительно вызвать его следующим образом:

<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
1
27.08.2010 07:47:32

Добавьте эту строку к загрузке страницы, если вы получаете объект ожидаемой ошибки.

ClientScript.GetPostBackEventReference(this, "");
0
25.10.2011 13:11:19

Вы можете использовать PageMethods.Your C# method Nameдля доступа к методам C # или VB.NET в JavaScript.

0
9.12.2016 17:48:21

Для обоих сценариев так легко (то есть синхронно / асинхронно) легко запустить обработчик событий на стороне сервера, например, событие нажатия кнопки.

Для запуска обработчика события элемента управления: Если вы уже добавили ScriptManager на свою страницу, пропустите шаг 1.

  1. Добавьте следующее в раздел клиентских скриптов вашей страницы

    //<![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. Напишите вам обработчик событий на стороне сервера для вашего контроля

      protected void btnSayHello_Click (отправитель объекта, EventArgs e) {Label1.Text = "Hello World ..."; }

    2. Добавьте клиентскую функцию для вызова обработчика событий на стороне сервера

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

Замените «btnSayHello» в приведенном выше коде на идентификатор клиента вашего элемента управления.

При этом, если ваш элемент управления находится внутри панели обновления, страница не будет обновляться. Это так просто.

Еще одна вещь, которую нужно сказать: будьте осторожны с идентификатором клиента, потому что это зависит от вашей политики генерации идентификаторов, определенной свойством ClientIDMode.

2
9.12.2016 17:48:56

Статическое строго типизированное программирование всегда казалось мне очень естественным, поэтому сначала я отказался от изучения JavaScript (не говоря уже о HTML и CSS), когда мне приходилось создавать веб-интерфейсы для своих приложений. Я бы сделал все, чтобы обойти это, например, перенаправление на страницу просто для выполнения и действия над событием OnLoad, если бы я мог писать на чистом C #.

Однако вы обнаружите, что если вы собираетесь работать с веб-сайтами, вы должны быть непредвзятыми и начать думать более ориентированными на веб-сайты (то есть не пытайтесь делать что-то на стороне клиента на сервере и наоборот) , Я люблю веб-формы ASP.NET и до сих пор использую их (а также MVC ), но я скажу, что, пытаясь упростить ситуацию и скрывая разделение клиента и сервера, это может сбить с толку новичков и фактически в конечном итоге усложнить ситуацию в разы ,

Мой совет - изучить некоторый базовый JavaScript (как регистрировать события, извлекать объекты DOM, манипулировать CSS и т. Д.), И вы найдете веб-программирование намного более приятным (не говоря уже о том, что проще). Многие люди упоминали о различных библиотеках Ajax, но я не видел реальных примеров Ajax, так что вот так. (Если вы не знакомы с Ajax, все, что вам нужно, - это сделать асинхронный HTTP-запрос на обновление содержимого (или, возможно, выполнить действия на стороне сервера в вашем сценарии) без перезагрузки всей страницы или полной обратной передачи.

Сторона клиента:

<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>

Вот и все. Хотя имя может вводить в заблуждение, результат может быть в виде простого текста или JSON, но вы не ограничены XML. jQuery предоставляет еще более простой интерфейс для выполнения вызовов Ajax (среди упрощения других задач JavaScript).

Запрос может быть HTTP-POST или HTTP-GET и не обязательно должен быть на веб-странице, но вы можете публиковать сообщения в любой службе, которая прослушивает HTTP-запросы, например в RESTful API. Веб-API ASP.NET MVC 4 позволяет также настроить веб-службу на стороне сервера для обработки запроса. Но многие люди не знают, что вы также можете добавить контроллеры API в проект веб-форм и использовать их для обработки Ajax-вызовов, подобных этой.

Серверный:

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

Затем просто зарегистрируйте HTTP-маршрут в файле Global.asax, чтобы ASP.NET знал, как направить запрос.

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

С помощью AJAX и контроллеров вы можете в любое время выполнить асинхронную отправку на сервер для выполнения любой операции на стороне сервера. Этот один-два шага обеспечивает гибкость JavaScript и мощь C # / ASP.NET, предоставляя пользователям, посещающим ваш сайт, общее удобство работы. Не жертвуя ничем, вы получаете лучшее из обоих миров.

Ссылки

4
22.02.2018 17:04:26

Попробуй это:

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

Или это

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

Используйте свойство OnClientClick кнопки для вызова функций JavaScript ...

0
9.12.2016 18:21:49

Вы также можете получить его, просто добавив эту строку в свой код JavaScript:

document.getElementById('<%=btnName.ClientID%>').click()

Я думаю, что это очень легко!

0
9.12.2016 18:22:35

Я пытаюсь реализовать это, но это не работает правильно. Страница отправляется обратно, но мой код не выполняется. Когда я отлаживаю страницу, RaisePostBackEvent никогда не запускается. Одна вещь, которую я сделал по-другому, я делаю это в пользовательском элементе управления, а не на странице aspx.

Если кто-то похож на Мерк, и у меня возникают проблемы с этим, у меня есть решение:

Когда у вас есть пользовательский элемент управления, кажется, что вы также должны создать PostBackEventHandler на родительской странице. И затем вы можете вызвать PostBackEventHandler пользовательского элемента управления, вызвав его напрямую. Увидеть ниже:

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

Где UserControlID - это идентификатор, который вы дали пользовательскому элементу управления на родительской странице, когда вложили его в разметку.

Примечание: Вы также можете просто просто вызвать методы, принадлежащие этому пользовательскому элементу управления напрямую (в этом случае вам понадобится только обработчик RaisePostBackEvent на родительской странице):

public void RaisePostBackEvent(string _arg)
{
    UserControlID.method1();
    UserControlID.method2();
}
2
22.02.2018 17:04:46
Пожалуйста, откройте новый вопрос. Вопрос, на который вы отправляете сообщение, старше 5 лет.
Nico 12.11.2013 21:21:00
Сожалею. Я сделаю это, когда у меня будет шанс.
davrob01 12.11.2013 23:36:59

Я думаю, что пост блога Как получить и показать данные базы данных SQL Server на странице ASP.NET с помощью Ajax (jQuery) поможет вам.

Код 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 серверная функция

[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
26.02.2019 12:52:35

Что касается:

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

button.click();

Это должно быть как:

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

Где formID - это идентификатор элемента управления ASP.NET в файле .aspx.

1
9.12.2016 18:25:41

Пожалуйста, попробуйте это:

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

ddlVoucherType - это элемент управления, который будет вызывать выбранное изменение индекса ... И вы можете поместить любую функцию в выбранное изменение индекса этого элемента управления.

0
9.12.2016 18:26:18

Самый простой и лучший способ добиться этого - использовать onmouseup()событие JavaScript, а неonclick()

Таким образом, вы будете запускать JavaScript после нажатия, и он не будет мешать OnClick()событию ASP .

0
9.12.2016 18:27:27

Я пробую это, и поэтому я мог запустить метод Asp.Net при использовании jQuery.

  1. Переадресация страницы в вашем коде jQuery

    window.location = "Page.aspx?key=1";
  2. Затем используйте строку запроса в загрузке страницы

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

Так что нет необходимости запускать дополнительный код

0
15.03.2017 18:13:17