Gọi hàm ASP.NET từ JavaScript?


140

Tôi đang viết một trang web trong ASP.NET. Tôi có một số mã JavaScript và tôi có một nút gửi với một sự kiện nhấp chuột.

Có thể gọi một phương thức tôi đã tạo trong ASP với sự kiện nhấp chuột của JavaScript không?


1
Bạn nên sử dụng một số thư viện Ajax như: Anthem
jdecuyper

Câu trả lời:


92

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


1
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.
merk

nó cho tôi một lỗi nói đối tượng mong đợi. Tôi đã gọi nó theo cách như vậy:window.onbeforeunload = confirmExit; //debugger; function confirmExit() { var pageId = '<%= Page.ClientID %>'; var argumentString = 'ReleaseLock'; __doPostBack(pageId, argumentString); }
Pavitar

Vì lý do nào, tôi không thể làm cho nó hoạt động với onkeyupsự kiện. Có JavaScript runtime error: '__doPostBack' is undefined. Tôi đang sử dụng C # và ASP.NET 2.0.
Andrew T.

58

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();

3
Nếu tôi muốn sử dụng một đối số thì sao? Tôi có thể lấy nó từ phía máy khách và sử dụng nó với button.Click () không?
Kubi

@Kubi một đối số ở phía máy chủ? Những gì tôi thường làm là tuần tự hóa các đối số cần được gửi đến phía máy chủ và đặt chúng vào một trường ẩn.
mbillard

bạn có thể vui lòng nhìn vào đây không? stackoverflow.com/questions/2536106/
Mạnh

phương thức Click có tồn tại không ??
Saher Ahwal

@saher có, nhưng nó thực sự .click (chữ thường c) ( comptechdoc.org/independent/web/cgi/javamanual/javabutton.html )
mbillard

18

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


11

Bạn có thể làm điều đó một cách không đồng bộ bằng cách sử dụng .NET Ajax PageMethods. Xem ở đây hoặc ở đây .


5

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

4

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


3

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.


1
Tôi ước bài đăng này gần gũi hơn với bài viết ở trên ... Tôi đã mất vài phút cố gắng tìm hiểu tại sao phương pháp đó không được đề cập đến trong tài liệu MS: /
Dave Swersky 16/07/2016

1
@Dave Đó là lý do tại sao mọi người nên bình luận về câu trả lời và không thêm nhận xét vào câu trả lời khác dưới dạng câu trả lời độc đáo.
Charles Boyung

2

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.

  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();
        }
    }
    //]]>
    1. 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 ..."; }

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


2

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();
}

Hãy mở một câu hỏi mới. Câu hỏi bạn đang đăng trên 5 tuổi.
Nico

Lấy làm tiếc. Tôi sẽ làm như vậy khi tôi có cơ hội.
davrob01

1

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.


1

Nếu chức năng __doPostBack không được tạo trên trang, bạn cần chèn một điều khiển để buộc nó như thế này:

<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />

1

Về:

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

button.click();

Nó sẽ giống như:

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

Trong đó formID là ID điều khiển ASP.NET trong tệp .aspx.


0

Thêm dòng này vào tải trang nếu bạn gặp lỗi dự kiến ​​đối tượng.

ClientScript.GetPostBackEventReference(this, "");

0

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.


0

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


0

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!


0

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.


0

Cách đơn giản nhất và tốt nhất để đạt được điều này là sử dụng onmouseup()sự kiện JavaScript chứ không phải làonclick()

Bằng cách đó, bạn sẽ kích hoạt JavaScript sau khi bạn nhấp và nó sẽ không can thiệp vào OnClick()sự kiện ASP .


0

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.

  1. Thực hiện chuyển hướng trang trong mã jQuery của bạn

    window.location = "Page.aspx?key=1";
  2. 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ã


0

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.