Я пишу веб-страницу в ASP.NET. У меня есть код JavaScript, и у меня есть кнопка отправки с событием click.
Можно ли вызвать метод, который я создал в ASP, с событием кликов JavaScript?
Я пишу веб-страницу в ASP.NET. У меня есть код JavaScript, и у меня есть кнопка отправки с событием click.
Можно ли вызвать метод, который я создал в ASP, с событием кликов JavaScript?
Хорошо, если вы не хотите делать это с помощью Ajax или каким-либо другим способом и просто хотите, чтобы произошла нормальная обратная передача ASP.NET, вот как вы это делаете (без использования каких-либо других библиотек):
Немного сложно, но...:)
я. В вашем файле кода (при условии, что вы используете С# и .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" как "аргументString", который вы передали из JavaScript. Теперь вы можете вызвать любое другое событие, которое вам нравится.
P.S: Это "underscore-underscore-doPostBack"... И в этой последовательности не должно быть места... Как-то WMD не позволяет мне писать символы подчеркивания, за которыми следует символ!
Метод __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();
Microsoft AJAX library выполнит это. Вы также можете создать собственное решение, которое предполагает использование AJAX для вызова собственных aspx (как в основном) script файлов для выполнения функций .NET.
Я предлагаю библиотеку Microsoft AJAX. После установки и ссылки вы просто добавляете строку на странице загрузки или init:
Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))
Затем вы можете делать такие вещи, как:
<Ajax.AjaxMethod()> _
Public Function Get5() AS Integer
Return 5
End Function
Затем вы можете называть его на своей странице следующим образом:
PageClassName.Get5(javascriptCallbackFunction);
Последний параметр вызова функции должен быть функцией обратного вызова javascript, которая будет выполняться при возврате запроса AJAX.
Вы можете сделать это асинхронно с помощью .NET Ajax PageMethods. См. здесь или здесь.
Библиотека Microsoft AJAX выполнит это. Вы также можете создать собственное решение, которое предполагает использование AJAX для вызова собственных aspx (как в основном) script файлов для выполнения функций .NET.
Это библиотека под названием AjaxPro, на которой был написан MVP с именем Michael Schwarz. Это была библиотека, не написанная Microsoft.
Я широко использовал AjaxPro, и это очень хорошая библиотека, которую я бы рекомендовал для простых обратных вызовов на сервере. Он отлично работает с версией Ajax Microsoft без проблем. Тем не менее, я бы отметил, с легкостью Microsoft сделала Ajax, я бы использовал его, если это действительно необходимо. Для выполнения некоторых очень сложных функций, которые вы получаете от Microsoft, требуется много JavaScript, просто отбросив их на панель обновления.
Статическое, строго типизированное программирование всегда казалось мне очень естественным, поэтому сначала я сопротивлялся изучению JavaScript (не говоря уже о HTML и CSS), когда мне приходилось создавать веб-интерфейсы для моих приложений. Я бы сделал все, чтобы обойти это, как перенаправление на страницу только для выполнения и действий в событии OnLoad, если бы я мог кодировать чисто С#.
Однако вы обнаружите, что если вы собираетесь работать с веб-сайтами, вы должны иметь открытый ум и начать думать о веб-ориентировании (то есть не пытайтесь делать клиентские вещи на сервере и наоборот -versa). Я люблю веб-формы ASP.NET и все еще использую его (а также MVC), но я скажу, что, пытаясь сделать вещи проще и скрывая разделение клиента и сервера, это может запутать новичков и на самом деле в конечном итоге затрудняет работу.
Мой совет - изучить базовый JavaScript (как регистрировать события, извлекать объекты DOM, манипулировать CSS и т.д.), и вы найдете веб-программирование намного более приятным (не говоря уже проще). Многие люди упомянули разные библиотеки Ajax, но я не видел реальных примеров Ajax, так что вот оно. (Если вы не знакомы с Ajax, все, что он делает, делает асинхронный HTTP-запрос для обновления контента (или, возможно, выполняет действия на стороне сервера в вашем сценарии) без перезагрузки всей страницы или полной обратной передачи.
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>
Что это. Хотя имя может вводить в заблуждение, результат может быть как в обычном тексте, так и в 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, предоставляя людям, посещающим ваш сайт, лучший общий опыт. Не жертвуя ничем, вы получаете лучшее из обоих миров.
Ссылки
Я думаю, что сообщение в блоге Как получить и показать данные базы данных SQL Server на странице 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
[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;
}
Это так легко для обоих сценариев (то есть синхронно/асинхронно), если вы хотите запускать обработчик событий на стороне сервера, например, событие нажатия кнопки.
Для запуска обработчика события элемента управления: Если вы добавили ScriptManager на свою страницу уже, пропустите шаг 1.
Добавьте в страницу клиента script следующую страницу
//<![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();
}
}
//]]>
Напишите вам обработчик событий на стороне сервера для вашего управления
protected void btnSayHello_Click (отправитель объекта, EventArgs e) { Label1.Text = "Hello World..."; }
Добавить клиентскую функцию для вызова обработчика событий на стороне сервера
функция SayHello() { __doPostBack ( "btnSayHello", ""); }
Замените "btnSayHello" в коде выше с вашим идентификатором клиента управления.
Таким образом, если ваш элемент управления находится внутри панели обновления, страница не будет обновляться. Это так легко.
Еще одна вещь, которая стоит сказать: Будьте осторожны с идентификатором клиента, потому что это зависит от вашей политики создания идентификатора, определенной с помощью свойства ClientIDMode.
Возможно, вы захотите создать веб-службу для своих общих методов.
Просто добавьте функцию WebMethodAttribute над функциями, которые вы хотите вызвать, и об этом.
Наличие веб-сервиса со всеми вашими обычными вещами также упрощает обслуживание системы.
Если функция __doPostBack не создается на странице, вам необходимо вставить элемент управления, чтобы заставить его следующим образом:
<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
Я пытаюсь реализовать это, но он не работает правильно. Страница отправка назад, но мой код не выполняется. Когда я отлаживаю страницы, RaisePostBackEvent никогда не запускается. Одна вещь, которую я сделал иначе я делаю это в пользовательском элементе управления вместо aspx стр.
Если кто-то еще похож на Мерка, и у меня возникли проблемы с этим, у меня есть решение:
Когда у вас есть пользовательский элемент управления, похоже, вы также должны создать PostBackEventHandler на родительской странице. И затем вы можете вызвать пользовательский элемент управления PostBackEventHandler, вызвав его напрямую. См. Ниже:
public void RaisePostBackEvent(string _arg)
{
UserControlID.RaisePostBackEvent(_arg);
}
Если UserControlID - это идентификатор, который вы указали на пользовательский элемент управления на родительской странице, когда вы вложили его в разметку.
Примечание. Вы также можете просто просто вызвать методы, принадлежащие этому пользовательскому элементу управления напрямую (в этом случае вам понадобится только обработчик RaisePostBackEvent на родительской странице):
public void RaisePostBackEvent(string _arg)
{
UserControlID.method1();
UserControlID.method2();
}
Относительно:
var button = document.getElementById(/* Button client id */);
button.click();
Он должен выглядеть следующим образом:
var button = document.getElementById('<%=formID.ClientID%>');
Где formID - это идентификатор элемента управления ASP.NET в файле .aspx.
Этот ответ работает как бриз для меня благодаря кросс-браузеру:
Метод __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
Добавьте эту строку в загрузку страницы, если вы получаете ожидаемую ошибку объекта.
ClientScript.GetPostBackEventReference(this, "");
Вы можете использовать PageMethods.Your C# method Name
для доступа к методам С# или методам 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 - это элемент управления, который будет вызывать выбранное изменение индекса... И вы можете поместить любую функцию в выбранное изменение индекса этого элемента управления.
Самый простой и лучший способ добиться этого - использовать событие onmouseup()
JavaScript, а не onclick()
Таким образом вы будете запускать JavaScript после нажатия и не будут мешать событию ASP onclick()
.
Я пытаюсь это сделать, поэтому я могу запустить метод Asp.Net при использовании jQuery.
Переадресация страницы в коде jQuery
window.location = "Page.aspx?key=1";
Затем используйте строку запроса в Page Load
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["key"] != null)
{
string key= Request.QueryString["key"];
if (key=="1")
{
// Some code
}
}
}
Поэтому нет необходимости запускать дополнительный код