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

Я пишу веб-страницу в ASP . NET. У меня есть код JavaScript, и у меня есть кнопка отправки с событием клика.
Можно ли вызвать метод, который я создал в ASP, с помощью события click JavaScript?
Вы должны использовать некоторую библиотеку Ajax, например: Anthem
20 ответов
Что ж, если вы не хотите делать это с помощью Ajax или каким-либо другим способом и просто хотите, чтобы происходила обычная обратная передача ASP . NET, вот как вы это делаете (без использования каких-либо других библиотек):
Хотя это немного сложно... :)
i. В вашем файле кода (при условии, что вы используете 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» в качестве «argumentString», который вы передали из JavaScript. Теперь вы можете назвать любое другое событие, которое вам нравится.
PS: Это 'подчеркивание-подчеркивание-doPostBack'... И в этой последовательности не должно быть пробелов... Почему-то WMD не позволяет мне писать символы подчеркивания, за которыми следует символ!
Я пытаюсь реализовать это, но это не работает правильно. Страница отправляется обратно, но мой код не выполняется. Когда я отлаживаю страницу, RaisePostBackEvent никогда не запускается. Одна вещь, которую я сделал по-другому, это то, что я делаю это в пользовательском элементе управления, а не на странице aspx.
это дает мне ошибку, говорит, что объект ожидается. Я назвал это так: window.onbeforeunload = confirmExit; // отладчик; function confirmExit() { var pageId = '<%= Page.ClientID %>'; var argumentsString = 'ReleaseLock'; __doPostBack(pageId, argumentsString); }
По какой-то причине я не мог заставить его работать с событием onkeyup. Получил ошибку времени выполнения JavaScript: «__doPostBack» не определено. Я использую С# и ASP . NET 2.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();
что, если я хочу использовать аргумент? могу ли я получить его со стороны клиента и использовать его с помощью button.Click()?
аргумент на стороне сервера? Что я обычно делаю, так это сериализую аргументы, которые нужно отправить на сервер, и помещаю их в скрытое поле.
не могли бы вы посмотреть здесь?
существует ли метод Click ??
да, но на самом деле это .click (строчная с)
Ошибка выполнения JavaScript: объект не поддерживает свойство или метод 'getElementByID', о, мби, перейдите на Id: D ffs, чувствительная к регистру чушь
Я потратил много времени на поиск способа скрыть (визуально компонент), а позже я ищу, как вызвать функцию asp из javascript.
Библиотека 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.
Вы можете сделать это асинхронно, используя .NET Ajax PageMethods.
Я думаю, что сообщение в блоге Как получить и показать данные базы данных 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;
}
Статическое, строго типизированное программирование всегда казалось мне очень естественным, поэтому сначала я сопротивлялся изучению 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, предоставляя людям, посещающим ваш сайт, лучший общий опыт. Не жертвуя ничем, вы получаете лучшее из обоих миров.
Рекомендации
- Ajax,
- jQuery Ajax,
- Контроллер в веб-формах
Библиотека Microsoft AJAX сделает это. Вы также можете создать свое собственное решение, которое включает использование AJAX для вызова ваших собственных файлов сценариев aspx (в основном) для запуска функций .NET.
Это библиотека под названием AjaxPro, написанная MVP по имени Майкл Шварц. Это была библиотека, написанная не Microsoft.
Я широко использовал AjaxPro, и это очень хорошая библиотека, которую я бы рекомендовал для простых обратных вызовов на сервер. Он хорошо работает с версией Microsoft Ajax без проблем. Тем не менее, я хотел бы отметить, насколько легко Microsoft сделала Ajax, я бы использовал его только в случае крайней необходимости. Требуется много JavaScript, чтобы реализовать некоторые действительно сложные функции, которые вы получаете от Microsoft, просто перетаскивая их на панель обновлений.
Хотелось бы, чтобы этот пост был ближе к предыдущему... Я потратил несколько минут, пытаясь понять, почему этот метод нигде не упоминается в документации MS:/
Вот почему люди должны комментировать ответы, а не добавлять комментарии к другим ответам как уникальные ответы.
Если функция __doPostBack не сгенерирована на странице, вам нужно вставить элемент управления, чтобы заставить ее работать следующим образом:
<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
Это так просто для обоих сценариев (то есть синхронного/асинхронного), если вы хотите инициировать обработчик событий на стороне сервера, например, событие нажатия кнопки.
Для запуска обработчика событий элемента управления: если вы уже добавили ScriptManager на свою страницу, пропустите шаг
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();
}
}
//]]>
2. Напишите обработчик событий на стороне сервера для вашего элемента управления.
protected void btnSayHello_Click(object sender, EventArgs e) { Label1.Text = "Hello World..."; }
3. Добавьте клиентскую функцию для вызова обработчика событий на стороне сервера.
function SayHello() { __doPostBack("btnSayHello", ""); }
Замените «btnSayHello» в приведенном выше коде идентификатором клиента вашего элемента управления.
Таким образом, если ваш элемент управления находится внутри панели обновления, страница не будет обновляться. Это так просто.
Еще одна вещь, которую следует сказать: будьте осторожны с идентификатором клиента, потому что он зависит от вашей политики генерации идентификатора, определенной с помощью свойства ClientIDMode.
Я пытаюсь реализовать это, но это не работает правильно. Страница отправляется обратно, но мой код не выполняется. Когда я отлаживаю страницу, RaisePostBackEvent никогда не запускается. Одна вещь, которую я сделал по-другому, это то, что я делаю это в пользовательском элементе управления, а не на странице aspx.
Если кто-то еще похож на Мерка и у него проблемы с этим, у меня есть решение:
Когда у вас есть пользовательский элемент управления, кажется, вы также должны создать PostBackEventHandler на родительской странице. И затем вы можете вызвать PostBackEventHandler пользовательского элемента управления, вызвав его напрямую. См. ниже:
public void RaisePostBackEvent(string _arg)
{
UserControlID.RaisePostBackEvent(_arg);
}
Где UserControlID — это идентификатор, который вы дали пользовательскому элементу управления на родительской странице, когда вы вложили его в разметку.
Примечание. Вы также можете просто напрямую вызывать методы, принадлежащие этому пользовательскому элементу управления (в этом случае вам понадобится только обработчик RaisePostBackEvent на родительской странице):
public void RaisePostBackEvent(string _arg)
{
UserControlID.method1();
UserControlID.method2();
}
Возможно, вы захотите создать веб-службу для ваших общих методов. Просто добавьте WebMethodAttribute поверх функций, которые вы хотите вызвать, и все. Наличие веб-сервиса со всеми вашими обычными вещами также упрощает обслуживание системы.
Касательно:
var button = document.getElementById(/* Button client id */);
button.click();
Это должно быть так:
var button = document.getElementById('<%=formID.ClientID%>');
Где formID — это идентификатор элемента управления ASP . NET в ASPX-файле.
Добавьте эту строку в загрузку страницы, если вы получаете ожидаемую ошибку объекта.
ClientScript.GetPostBackEventReference(this, "");
Вы можете использовать PageMethods.Your имя метода C# для доступа к методам C# или методам VB . NET в JavaScript.
Попробуй это:
if(!ClientScript.IsStartupScriptRegistered("window"))
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true);
}
Или это
Response.Write("<script>alert('Hello World');</script>");
Используйте свойство OnClientClick кнопки для вызова функций JavaScript...
Вы также можете получить его, просто добавив эту строку в свой код JavaScript:
document.getElementById('<%=btnName.ClientID%>').click()
Я думаю, что это очень легко!
Пожалуйста, попробуйте это:
<%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>;
ddlVoucherType - это элемент управления, который вызовет выбранное изменение индекса... И вы можете поместить любую функцию в выбранное изменение индекса этого элемента управления.
Самый простой и лучший способ добиться этого — использовать событие JavaScript onmouseup(), а не onclick().
Таким образом, вы запустите JavaScript после щелчка, и он не будет мешать событию ASP OnClick().
Я пробую это, и поэтому я могу запустить метод 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
}
}
}
Так что нет необходимости запускать дополнительный код
Этот ответ работает как ветерок для меня, благодаря кросс-браузеру:
Метод __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();
Инструменты устранения неполадок JavaScript в Internet Explorer
Инструменты устранения неполадок JavaScript в Internet Explorer Я интенсивно использую Firebug и консоль Mozilla JS, но время от времени я сталкиваюсь с ошибкой JavaScript только для IE, которую действительно трудно найти (например, ошибка в строке 724, когда исходный HTML-код содержит всего 200 строк). Я хотел бы иметь легкий JS-инструмент (а-ля firebug) для Internet Explorer, что-то, что я могу установить за считанные секунды на ПК клиента, если я столкнусь с ошибкой, а затем удалю. Некоторые инструменты Microsoft требуют значительного времени для загрузки и настройки. Есть идеи? Рассматривали ли вы Firebug Lite? Есть отладчик скриптов майкрософт Используйте инструмент, который можно запустить как букмарклет: - Jash - Firebug Lite Я думаю, что F12 IE работает довольно хорошо 7 ответов Для этого вам может пригодиться Firebug Lite. Его букмарклет должен быть особенно полезен при отладке на компьютере пользователя. Firebug больше не существует как отдельная сущность…
MAC-адреса в JavaScript Я знаю, что мы можем получить MAC-адрес пользователя через IE (объекты ActiveX). Есть ли способ получить MAC-адрес пользователя с помощью JavaScript? 8 ответов Я согласен со всеми предыдущими ответами, что это будет уязвимость конфиденциальности/безопасности, если вы сможете сделать это непосредственно из Javascript. Я могу думать о двух вещах: Использование Java (с подписанным апплетом) Использование подписанного Javascript, который в FF (и в Mozilla вообще) получает более высокие привилегии, чем обычный JS (но довольно сложен в настройке) Мне было любопытно узнать, можем ли мы получить уникальную информацию…
Захват клавиши TAB в текстовом поле
Захват клавиши TAB в текстовом поле Я хотел бы иметь возможность использовать клавишу Tab в текстовом поле для перехода через четыре пробела. Как и сейчас, клавиша Tab перемещает мой курсор к следующему вводу. Есть ли какой-нибудь JavaScript, который будет захватывать клавишу Tab в текстовом поле, прежде чем она появится в пользовательском интерфейсе? Я понимаю, что некоторые браузеры (например, FireFox) могут не допускать этого. Как насчет специальной комбинации клавиш…