Câu trả lời:
Chà, nếu bạn không muốn làm điều đó bằng Ajax hoặc bất kỳ cách nào khác và chỉ muốn một postback ASP.NET bình thường xảy ra, đây là cách bạn làm điều đó (không sử dụng bất kỳ thư viện nào khác):
Đó là một chút khó khăn mặc dù ... :)
Tôi. Trong tệp mã của bạn (giả sử bạn đang sử dụng C # và .NET 2.0 trở lên), hãy thêm Giao diện sau vào lớp Trang của bạn để làm cho nó trông giống như
public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}
ii. Điều này sẽ thêm (sử dụng Tab- Tab) chức năng này vào tệp mã của bạn:
public void RaisePostBackEvent(string eventArgument) { }
iii. Trong sự kiện onclick của bạn bằng JavaScript, hãy viết đoạn mã sau:
var pageId = '<%= Page.ClientID %>';
__doPostBack(pageId, argumentString);
Điều này sẽ gọi phương thức 'RaisePostBackEvent' trong tệp mã của bạn với 'eventArgument' là 'argumentString' mà bạn đã truyền từ JavaScript. Bây giờ, bạn có thể gọi bất kỳ sự kiện nào khác mà bạn thích.
PS: Đó là 'gạch dưới-gạch dưới-doPostBack' ... Và, không nên có khoảng trống trong chuỗi đó ... Bằng cách nào đó WMD không cho phép tôi viết vào dấu gạch dưới theo sau bởi một ký tự!
window.onbeforeunload = confirmExit; //debugger; function confirmExit() { var pageId = '<%= Page.ClientID %>'; var argumentString = 'ReleaseLock'; __doPostBack(pageId, argumentString); }
onkeyup
sự kiện. Có JavaScript runtime error: '__doPostBack' is undefined
. Tôi đang sử dụng C # và ASP.NET 2.0.
Các __doPostBack()
phương pháp hoạt động tốt.
Một giải pháp khác (rất hackish) là chỉ cần thêm một nút ASP vô hình trong đánh dấu của bạn và nhấp vào nó bằng một phương thức JavaScript.
<div style="display: none;">
<asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>
Từ JavaScript của bạn, truy xuất tham chiếu đến nút bằng ClientID của nó và sau đó gọi phương thức .click () trên đó.
var button = document.getElementById(/* button client id */);
button.click();
Các thư viện Microsoft AJAX sẽ thực hiện điều này. Bạn cũng có thể tạo giải pháp của riêng mình liên quan đến việc sử dụng AJAX để gọi các tệp script aspx (về cơ bản) của riêng bạn để chạy các hàm .NET.
Tôi đề nghị thư viện Microsoft AJAX. Sau khi cài đặt và tham chiếu, bạn chỉ cần thêm một dòng trong tải trang hoặc init của bạn:
Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))
Sau đó, bạn có thể làm những việc như:
<Ajax.AjaxMethod()> _
Public Function Get5() AS Integer
Return 5
End Function
Sau đó, bạn có thể gọi nó trên trang của bạn là:
PageClassName.Get5(javascriptCallbackFunction);
Tham số cuối cùng của lệnh gọi hàm của bạn phải là hàm gọi lại javascript sẽ được thực thi khi yêu cầu AJAX được trả về.
Tôi nghĩ rằng bài đăng trên blog Cách tìm nạp và hiển thị dữ liệu cơ sở dữ liệu SQL Server trong trang ASP.NET bằng Ajax (jQuery) sẽ giúp bạn.
Mã 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>
Chức năng phụ của máy chủ 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;
}
Lập trình tĩnh, gõ mạnh luôn cảm thấy rất tự nhiên đối với tôi, vì vậy ban đầu tôi đã chống lại việc học JavaScript (không đề cập đến HTML và CSS) khi tôi phải xây dựng các giao diện người dùng dựa trên web cho các ứng dụng của mình. Tôi sẽ làm bất cứ điều gì để giải quyết vấn đề này như chuyển hướng đến một trang chỉ để thực hiện và hành động trong sự kiện OnLoad, miễn là tôi có thể mã hóa C # thuần túy.
Tuy nhiên, bạn sẽ thấy rằng nếu bạn sẽ làm việc với các trang web, bạn phải có một suy nghĩ cởi mở và bắt đầu suy nghĩ theo định hướng web nhiều hơn (nghĩa là đừng cố gắng làm những việc phía máy khách trên máy chủ và ngược lại) . Tôi yêu các biểu mẫu web ASP.NET và vẫn sử dụng nó (cũng như MVC ), nhưng tôi sẽ nói rằng bằng cách cố gắng làm cho mọi thứ đơn giản hơn và che giấu sự tách biệt giữa máy khách và máy chủ, nó có thể gây nhầm lẫn cho người mới và thực sự đôi khi làm cho mọi thứ trở nên khó khăn hơn .
Lời khuyên của tôi là tìm hiểu một số JavaScript cơ bản (cách đăng ký sự kiện, truy xuất các đối tượng DOM, thao tác CSS, v.v.) và bạn sẽ thấy lập trình web thú vị hơn nhiều (chưa kể dễ dàng hơn). Rất nhiều người đã đề cập đến các thư viện Ajax khác nhau, nhưng tôi không thấy bất kỳ ví dụ Ajax thực tế nào, vì vậy nó sẽ xuất hiện. .
Phía khách hàng:
<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>
Đó là nó. Mặc dù tên có thể gây hiểu nhầm, kết quả cũng có thể bằng văn bản thuần túy hoặc JSON, nhưng bạn không bị giới hạn đối với XML. jQuery cung cấp một giao diện thậm chí đơn giản hơn để thực hiện các cuộc gọi Ajax (trong số đơn giản hóa các tác vụ JavaScript khác).
Yêu cầu có thể là HTTP-POST hoặc HTTP-GET và không phải vào trang web, nhưng bạn có thể đăng lên bất kỳ dịch vụ nào lắng nghe các yêu cầu HTTP như API RESTful . API Web ASP.NET MVC 4 giúp thiết lập dịch vụ web phía máy chủ để xử lý yêu cầu một cách dễ dàng. Nhưng nhiều người không biết rằng bạn cũng có thể thêm bộ điều khiển API vào dự án biểu mẫu web và sử dụng chúng để xử lý các cuộc gọi Ajax như thế này.
Phía máy chủ:
public class DataController : ApiController
{
public HttpResponseMessage<string[]> Get()
{
HttpResponseMessage<string[]> response = new HttpResponseMessage<string[]>(
Repository.Get(true),
new MediaTypeHeaderValue("application/json")
);
return response;
}
}
Toàn cầu
Sau đó, chỉ cần đăng ký tuyến HTTP trong tệp Global.asax của bạn, vì vậy ASP.NET sẽ biết cách điều hướng yêu cầu.
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}");
}
Với AJAX và Bộ điều khiển, bạn có thể đăng lại máy chủ bất cứ lúc nào một cách không đồng bộ để thực hiện bất kỳ hoạt động phía máy chủ nào. Cú đấm có một không hai này cung cấp cả tính linh hoạt của JavaScript và sức mạnh của C # / ASP.NET, mang lại cho những người truy cập trang web của bạn trải nghiệm tổng thể tốt hơn. Không hy sinh bất cứ điều gì, bạn có được điều tốt nhất của cả hai thế giới.
Người giới thiệu
Thư viện Microsoft AJAX sẽ thực hiện điều này. Bạn cũng có thể tạo giải pháp của riêng mình liên quan đến việc sử dụng AJAX để gọi các tệp script aspx (về cơ bản) của riêng bạn để chạy các hàm .NET.
Đây là thư viện có tên AjaxPro được viết là MVP có tên Michael Schwarz . Đây là thư viện không được viết bởi Microsoft.
Tôi đã sử dụng AjaxPro rộng rãi và đó là một thư viện rất hay, tôi muốn giới thiệu cho các cuộc gọi lại đơn giản đến máy chủ. Nó hoạt động tốt với phiên bản Microsoft của Ajax mà không gặp vấn đề gì. Tuy nhiên, tôi sẽ lưu ý, với việc Microsoft đã tạo ra Ajax dễ dàng như thế nào, tôi sẽ chỉ sử dụng nó nếu thực sự cần thiết. Phải mất rất nhiều JavaScript để thực hiện một số chức năng thực sự phức tạp mà bạn có được từ Microsoft bằng cách thả nó vào bảng cập nhật.
Thật dễ dàng cho cả hai kịch bản (nghĩa là đồng bộ / không đồng bộ) nếu bạn muốn kích hoạt trình xử lý sự kiện phía máy chủ, ví dụ: sự kiện nhấp chuột của Nút.
Để kích hoạt trình xử lý sự kiện của điều khiển: Nếu bạn đã thêm ScriptManager trên trang của mình thì hãy bỏ qua bước 1.
Thêm phần sau vào phần kịch bản trang khách của bạn
//<![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();
}
}
//]]>
Viết cho bạn trình xử lý sự kiện phía máy chủ để kiểm soát
được bảo vệ void btnSayHello_Click (người gửi đối tượng, EventArss e) {Label1.Text = "Xin chào thế giới ..."; }
Thêm chức năng máy khách để gọi trình xử lý sự kiện phía máy chủ
hàm SayHello () {__doPostBack ("btnSayHello", ""); }
Thay thế "btnSayHello" trong mã ở trên bằng id khách hàng điều khiển của bạn.
Bằng cách làm như vậy, nếu điều khiển của bạn nằm trong bảng cập nhật, trang sẽ không làm mới. Điều đó thật dễ dàng.
Một điều khác để nói là: Hãy cẩn thận với id khách hàng, vì điều này phụ thuộc vào chính sách tạo ID của bạn được xác định với thuộc tính ClientIDMode.
Tôi đang cố gắng thực hiện điều này nhưng nó không hoạt động đúng. Trang đang đăng lại, nhưng mã của tôi không được thực thi. Khi tôi gỡ lỗi trang, RaisePostBackEvent không bao giờ bị sa thải. Một điều tôi đã làm khác là tôi đang làm điều này trong điều khiển người dùng thay vì trang aspx.
Nếu bất cứ ai khác giống như Merk, và gặp khó khăn trong việc này, tôi có một giải pháp:
Khi bạn có quyền kiểm soát người dùng, có vẻ như bạn cũng phải tạo PostBackEventHandler trong trang mẹ. Và sau đó, bạn có thể gọi PostBackEventHandler của điều khiển người dùng bằng cách gọi trực tiếp. Xem bên dưới:
public void RaisePostBackEvent(string _arg)
{
UserControlID.RaisePostBackEvent(_arg);
}
Trong đó UserControlID là ID bạn đã cấp cho người dùng quyền kiểm soát trên trang mẹ khi bạn lồng nó vào phần đánh dấu.
Lưu ý: Bạn cũng có thể chỉ cần gọi các phương thức thuộc quyền kiểm soát người dùng đó trực tiếp (trong trường hợp đó, bạn sẽ chỉ cần trình xử lý RaisePostBackEvent trong trang mẹ):
public void RaisePostBackEvent(string _arg)
{
UserControlID.method1();
UserControlID.method2();
}
Bạn có thể muốn tạo một dịch vụ web cho các phương thức phổ biến của mình.
Chỉ cần thêm một WebMethodAttribution trên các chức năng bạn muốn gọi và đó là về nó.
Có một dịch vụ web với tất cả các công cụ phổ biến của bạn cũng làm cho hệ thống dễ bảo trì hơn.
Bạn có thể sử dụng PageMethods.Your C# method Name
để truy cập các phương thức C # hoặc phương thức VB.NET vào JavaScript.
Thử cái này:
if(!ClientScript.IsStartupScriptRegistered("window"))
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true);
}
Hoặc cái này
Response.Write("<script>alert('Hello World');</script>");
Sử dụng thuộc tính OnClientClick của nút để gọi các hàm JavaScript ...
Bạn cũng có thể lấy nó bằng cách chỉ thêm dòng này vào mã JavaScript của mình:
document.getElementById('<%=btnName.ClientID%>').click()
Tôi nghĩ rằng điều này là rất nhiều dễ dàng!
Vui lòng thử điều này:
<%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>;
ddlVoucherType là một điều khiển mà thay đổi chỉ mục được chọn sẽ gọi ... Và bạn có thể đặt bất kỳ chức năng nào vào thay đổi chỉ mục đã chọn của điều khiển này.
Tôi thử điều này và vì vậy tôi có thể chạy một phương thức Asp.Net trong khi sử dụng jQuery.
Thực hiện chuyển hướng trang trong mã jQuery của bạn
window.location = "Page.aspx?key=1";
Sau đó, sử dụng Chuỗi truy vấn trong Tải trang
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["key"] != null)
{
string key= Request.QueryString["key"];
if (key=="1")
{
// Some code
}
}
}
Vì vậy, không cần phải chạy thêm mã
Câu trả lời này hoạt động như một làn gió cho tôi nhờ trình duyệt chéo:
Phương thức __doPostBack () hoạt động tốt.
Một giải pháp khác (rất hackish) là chỉ cần thêm một nút ASP vô hình trong đánh dấu của bạn và nhấp vào nó bằng một phương thức JavaScript.
<div style="display: none;">
<asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>
Từ JavaScript của bạn, truy xuất tham chiếu đến nút bằng ClientID của nó và sau đó gọi phương thức .Click () trên đó:
var button = document.getElementByID(/* button client id */);
button.Click();
Blockquote