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

голоса
124

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

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

Задан 06/08/2008 в 18:16
источник пользователем
На других языках...                            


20 ответов

голоса
88

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

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

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

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» как «argumentString», переданными из JavaScript. Теперь, вы можете назвать любое другое событие, которое вы любите.

PS: То есть «подчеркивание-подчеркивание-doPostBack» ... И, не должно быть никакого места в этой последовательности ... Как-то ОМП не позволяет мне писать подчеркивания следует символ!

Ответил 06/08/2008 d 19:04
источник пользователем

голоса
54

__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();
Ответил 11/08/2008 d 20:03
источник пользователем

голоса
18

Библиотека 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 возвращается.

Ответил 06/08/2008 d 18:40
источник пользователем

голоса
11

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

Ответил 06/08/2008 d 18:23
источник пользователем

голоса
4

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

Вы найдете , однако , что если вы собираетесь работать с веб - сайтами, вы должны иметь открытый ум и начать думать более веб-ориентированных (то есть, не пытайтесь сделать на стороне клиента , то на сервере , и наоборот) , Я люблю WebForms 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. ASP.NET MVC 4 Web API делает создание веб - службы на стороне сервера для обработки запроса на ветер , а также. Но многие люди не знают , что вы также можете добавить контроллеры 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 и мощность С # / ASP.NET, давая людей, посещающих ваш сайт лучше общий опыт. Без ущерба ничего, вы получаете лучшее из обоих миров.

Рекомендации

Ответил 13/06/2012 d 11:36
источник пользователем

голоса
3

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

JavaScript код

<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<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 Server Side Функция

[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;
}
Ответил 21/05/2014 d 12:28
источник пользователем

голоса
3

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

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

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

Ответил 25/08/2008 d 18:25
источник пользователем

голоса
2

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

Для запуска обработчика событий для элемента управления: Если вы добавили 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. Написать вам обработчик события на стороне сервера для управления

      защищенный аннулируются btnSayHello_Click (объект отправителя, EventArgs е) {Label1.Text = "Hello World ..."; }

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

      функционировать SayHello () {__doPostBack ( "btnSayHello", ""); }

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

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

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

Ответил 12/08/2011 d 13:48
источник пользователем

голоса
1

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

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

button.click();

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

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

Где FormID является контроль ID ASP.NET в файле .aspx.

Ответил 27/11/2014 d 06:30
источник пользователем

голоса
1

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

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

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

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

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

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

public void RaisePostBackEvent(string _arg)
{
    UserControlID.method1();
    UserControlID.method2();
}
Ответил 12/11/2013 d 22:01
источник пользователем

голоса
1

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

<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
Ответил 26/08/2010 d 17:19
источник пользователем

голоса
1

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

Ответил 11/08/2008 d 19:15
источник пользователем

голоса
0

Я стараюсь это и таким образом я мог запустить метод 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
            }
        }
    }
    

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

Ответил 15/03/2017 d 18:07
источник пользователем

голоса
0

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

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

Ответил 05/12/2016 d 09:29
источник пользователем

голоса
0

Пожалуйста, попробуйте следующее:

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

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

Ответил 05/03/2016 d 09:29
источник пользователем

голоса
0

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

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

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

Ответил 01/10/2013 d 11:23
источник пользователем

голоса
0

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

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

Или это

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

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

Ответил 14/03/2013 d 08:39
источник пользователем

голоса
0

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

Ответил 15/06/2011 d 08:06
источник пользователем

голоса
0

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

ClientScript.GetPostBackEventReference(this, "");
Ответил 12/02/2011 d 10:21
источник пользователем

голоса
0

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

Метод __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

Ответил 10/05/2010 d 12:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more