เรียกฟังก์ชั่น ASP.NET จาก JavaScript?


140

ฉันกำลังเขียนเว็บเพจใน ASP.NET ฉันมีรหัสจาวาสคริปต์บางส่วนและฉันมีปุ่มส่งพร้อมเหตุการณ์คลิก

เป็นไปได้ไหมที่จะเรียกวิธีการที่ฉันสร้างขึ้นใน ASP พร้อมกับเหตุการณ์การคลิกของ JavaScript?


1
คุณควรใช้ห้องสมุดอาแจ็กซ์เช่น: Anthem
jdecuyper

คำตอบ:


92

ถ้าคุณไม่ต้องการใช้ Ajax หรือวิธีอื่นและต้องการให้ ASP.NET postback ปกติเกิดขึ้นนี่คือวิธีที่คุณทำได้ (โดยไม่ต้องใช้ไลบรารีอื่น):

มันค่อนข้างยุ่งยากเล็กน้อย ... :)

ผม. ในไฟล์รหัสของคุณ (สมมติว่าคุณใช้ C # และ. NET 2.0 หรือใหม่กว่า) เพิ่มอินเทอร์เฟซต่อไปนี้ในคลาสเพจของคุณเพื่อให้ดูเหมือน

public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}

ii ควรเพิ่ม (ใช้Tab- Tab) ฟังก์ชันนี้ในไฟล์รหัสของคุณ:

public void RaisePostBackEvent(string eventArgument) { }

สาม. ในเหตุการณ์ onclick ของคุณใน JavaScript ให้เขียนรหัสต่อไปนี้:

var pageId = '<%=  Page.ClientID %>';
__doPostBack(pageId, argumentString);

การดำเนินการนี้จะเรียกใช้เมธอด 'RaisePostBackEvent' ในไฟล์รหัสของคุณด้วย 'eventArgument' เป็น 'อาร์กิวเมนต์String' ที่คุณส่งผ่านจาก JavaScript ตอนนี้คุณสามารถเรียกกิจกรรมอื่น ๆ ที่คุณชอบ

PS: นั่นคือ 'ขีดล่าง - ขีดล่าง-doPostBack' ... และไม่ควรมีช่องว่างในลำดับนั้น ... อย่างใด WMD ไม่อนุญาตให้ฉันเขียนขีดล่างตามด้วยอักขระ!


1
ฉันพยายามที่จะใช้สิ่งนี้ แต่มันไม่ทำงาน หน้ากำลังโพสต์กลับ แต่รหัสของฉันไม่ได้รับการดำเนินการ เมื่อฉันตรวจแก้จุดบกพร่องหน้า RaisePostBackEvent จะไม่ถูกไล่ออก สิ่งหนึ่งที่ฉันทำแตกต่างกันคือฉันกำลังทำสิ่งนี้ในการควบคุมผู้ใช้แทนที่จะเป็นหน้า aspx
merk

มันทำให้ฉันมีข้อผิดพลาดว่าวัตถุที่คาดหวัง ฉันได้เรียกมันในลักษณะเช่นนี้:window.onbeforeunload = confirmExit; //debugger; function confirmExit() { var pageId = '<%= Page.ClientID %>'; var argumentString = 'ReleaseLock'; __doPostBack(pageId, argumentString); }
Pavitar

ด้วยเหตุผลใดก็ตามฉันไม่สามารถทำงานกับonkeyupเหตุการณ์ได้ ได้JavaScript runtime error: '__doPostBack' is undefinedแล้ว ฉันใช้ C # และ ASP.NET 2.0
Andrew T.

58

__doPostBack()วิธีการทำงานได้ดี

โซลูชันอื่น (แฮ็คมาก) เพียงเพิ่มปุ่ม ASP ที่มองไม่เห็นในมาร์กอัพของคุณแล้วคลิกด้วยวิธี JavaScript

<div style="display: none;">
   <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>

จาก JavaScript ของคุณดึงอ้างอิงถึงปุ่มใช้ของClientIDแล้วโทรจำนวนคลิก ()วิธีการเกี่ยวกับมัน

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

button.click();

3
ถ้าฉันต้องการใช้การโต้เถียง ฉันจะเอามันมาจากฝั่งไคลเอ็นต์และใช้มันด้วย button.Click () ได้ไหม?
Kubi

@Kubi อาร์กิวเมนต์บนฝั่งเซิร์ฟเวอร์หรือไม่ สิ่งที่ฉันมักจะทำคือจัดอันดับอาร์กิวเมนต์ที่ต้องส่งไปยังฝั่งเซิร์ฟเวอร์และวางไว้ในเขตข้อมูลที่ซ่อนอยู่
mbillard

คุณช่วยดูที่นี่หน่อยได้ไหม? stackoverflow.com/questions/2536106/…
Kubi

วิธีการคลิกอยู่?
Saher Ahwal

@ ใช่ใช่ แต่จริง ๆ แล้วคลิก (ตัวพิมพ์เล็ก c) ( comptechdoc.org/ind Independent/web/cgi/javamanual/javabutton.html )
mbillard

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 กลับมา



5

ฉันคิดว่าการโพสต์บล็อกวิธีดึง & แสดงข้อมูลฐานข้อมูล SQL Server ในหน้า ASP.NET โดยใช้ Ajax (jQuery)จะช่วยคุณ

รหัสจาวาสคริปต์

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

4

การเขียนโปรแกรมแบบคงที่และมีการพิมพ์อย่างรุนแรงทำให้ฉันรู้สึกเป็นธรรมชาติมากในตอนแรกฉันเลยต่อต้านการเรียนรู้ JavaScript (ไม่ต้องพูดถึง HTML และ CSS) เมื่อฉันต้องสร้างส่วนหน้าเว็บสำหรับแอปพลิเคชันของฉัน ฉันจะทำทุกอย่างเพื่อหลีกเลี่ยงปัญหานี้เช่นการเปลี่ยนเส้นทางไปยังหน้าเว็บเพื่อดำเนินการและดำเนินการกับกิจกรรม OnLoad ตราบใดที่ฉันสามารถใช้รหัส C # ได้

คุณจะพบว่าหากคุณกำลังจะทำงานกับเว็บไซต์คุณต้องมีใจที่เปิดกว้างและเริ่มคิดเชิงเว็บมากขึ้น (นั่นคืออย่าพยายามทำสิ่งที่ฝั่งไคลเอ็นต์บนเซิร์ฟเวอร์และในทางกลับกัน) . ฉันรัก ASP.NET webforms และยังคงใช้มัน (เช่นเดียวกับMVC ) แต่ฉันจะบอกว่าการพยายามทำให้สิ่งต่าง ๆ ง่ายขึ้นและซ่อนการแยกไคลเอนต์และเซิร์ฟเวอร์มันอาจสร้างความสับสนให้กับผู้มาใหม่และท้ายที่สุดทำให้สิ่งต่าง ๆ ยากขึ้น .

คำแนะนำของฉันคือการเรียนรู้พื้นฐานของจาวาสคริปต์ (วิธีการลงทะเบียนเหตุการณ์, ดึงวัตถุ DOM, จัดการ CSS, ฯลฯ ) และคุณจะพบว่าการเขียนโปรแกรมเว็บสนุกยิ่งขึ้น (ไม่พูดถึงง่ายกว่า) ผู้คนจำนวนมากพูดถึงห้องสมุดอาแจ็กซ์ที่แตกต่างกัน แต่ฉันไม่เห็นตัวอย่างอาแจ็กซ์ที่แท้จริงดังนั้นจึงไปที่นี่ (ถ้าคุณไม่คุ้นเคยกับ Ajax ทั้งหมดนั้นคือการร้องขอ HTTP แบบอะซิงโครนัสเพื่อรีเฟรชเนื้อหา (หรืออาจดำเนินการกับฝั่งเซิร์ฟเวอร์ในสถานการณ์ของคุณ) โดยไม่ต้องโหลดซ้ำทั้งหน้าหรือทำ postback แบบเต็ม

ด้านลูกค้า:

<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 และพลังของ C # / ASP.NET ทำให้ผู้คนที่เข้าชมเว็บไซต์ของคุณได้รับประสบการณ์โดยรวมที่ดีขึ้น คุณจะได้รับสิ่งที่ดีที่สุดทั้งสองโลกโดยไม่ต้องเสียสละอะไรเลย

อ้างอิง


3

ไลบรารี Microsoft AJAX จะทำสิ่งนี้ให้สำเร็จ คุณสามารถสร้างโซลูชันของคุณเองที่เกี่ยวข้องกับการใช้ AJAX เพื่อเรียกไฟล์สคริปต์ aspx ของคุณเอง (โดยทั่วไป) เพื่อเรียกใช้ฟังก์ชัน. NET

นี้เป็นห้องสมุดที่เรียกว่า AjaxPro ซึ่งเขียน MVP ชื่อไมเคิล Schwarz นี่คือห้องสมุดไม่ได้เขียนโดย Microsoft

ฉันใช้ AjaxPro อย่างกว้างขวางและเป็นห้องสมุดที่ดีมากที่ฉันอยากจะแนะนำสำหรับการโทรกลับไปยังเซิร์ฟเวอร์อย่างง่าย มันทำงานได้ดีกับ Ajax รุ่น Microsoft โดยไม่มีปัญหา อย่างไรก็ตามฉันจะทราบด้วยว่า Microsoft ทำ Ajax ง่ายเพียงใดฉันจะใช้เมื่อจำเป็นจริงๆเท่านั้น JavaScript มีจำนวนมากที่ต้องใช้ฟังก์ชั่นที่ซับซ้อนบางอย่างที่คุณได้รับจาก Microsoft เพียงแค่วางลงในแผงการอัพเดท


1
ฉันหวังว่าโพสต์นี้ได้รับการใกล้ชิดกับคนที่ดังกล่าวข้างต้น ... ฉันพัดหลายนาทีพยายามที่จะคิดออกว่าทำไมวิธีการที่ถูกกล่าวถึงไม่มีที่ไหนในเอกสาร MS นี้: /
เดฟ Swersky

1
@Dave นั่นเป็นสาเหตุที่ผู้คนควรแสดงความคิดเห็นเกี่ยวกับคำตอบและไม่เพิ่มความคิดเห็นในคำตอบอื่น ๆ เพื่อเป็นคำตอบที่ไม่เหมือนใคร
Charles Boyung

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 e) {Label1.Text = "Hello World ... "; }

    2. เพิ่มฟังก์ชันไคลเอ็นต์เพื่อเรียกตัวจัดการเหตุการณ์ฝั่งเซิร์ฟเวอร์

      ฟังก์ชัน SayHello () {__doPostBack ("btnSayHello", ""); }

แทนที่ "btnSayHello" ในรหัสด้านบนด้วยรหัสลูกค้าของตัวควบคุมของคุณ

หากทำเช่นนั้นหากตัวควบคุมของคุณอยู่ในแผงควบคุมอัปเดตหน้านั้นจะไม่รีเฟรช นั่นง่ายมาก

อีกสิ่งหนึ่งที่จะกล่าวคือ: ระวังรหัสลูกค้าเพราะขึ้นอยู่กับนโยบายการสร้าง ID ของคุณที่กำหนดด้วยคุณสมบัติ ClientIDMode


2

ฉันพยายามที่จะใช้สิ่งนี้ แต่มันไม่ทำงาน หน้ากำลังโพสต์กลับ แต่รหัสของฉันไม่ได้รับการดำเนินการ เมื่อฉันตรวจแก้จุดบกพร่องหน้า RaisePostBackEvent จะไม่ถูกไล่ออก สิ่งหนึ่งที่ฉันทำแตกต่างกันคือฉันกำลังทำสิ่งนี้ในการควบคุมผู้ใช้แทนที่จะเป็นหน้า aspx

หากใครเป็นเหมือน Merk และมีปัญหาในการมาที่นี่ฉันมีทางออก:

เมื่อคุณมีการควบคุมผู้ใช้ดูเหมือนคุณจะต้องสร้าง PostBackEventHandler ในหน้าหลัก และจากนั้นคุณสามารถเรียกใช้ PostBackEventHandler ของตัวควบคุมผู้ใช้โดยการเรียกมันโดยตรง ดูด้านล่าง:

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

โดยที่ UserControlID เป็นรหัสที่คุณให้การควบคุมผู้ใช้ในหน้าหลักเมื่อคุณซ้อนในเครื่องหมายขึ้น

หมายเหตุ: คุณสามารถเพียงแค่เรียกเมธอดที่เป็นของผู้ใช้ควบคุมโดยตรง (ในกรณีนี้คุณจะต้องใช้ตัวจัดการ RaisePostBackEvent ในหน้าพาเรนต์):

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

โปรดเปิดคำถามใหม่ คำถามที่คุณโพสต์ไว้มีอายุเกิน 5 ปี
Nico

ขอโทษ ฉันจะทำเช่นนั้นเมื่อฉันมีโอกาส
davrob01

1

คุณอาจต้องการสร้างบริการเว็บสำหรับวิธีการทั่วไปของคุณ
เพียงเพิ่ม WebMethodAttribute ผ่านฟังก์ชั่นที่คุณต้องการโทรออก
การมีบริการเว็บพร้อมกับข้อมูลทั่วไปทั้งหมดของคุณยังทำให้ระบบง่ายต่อการดูแลรักษา


1

หากไม่ได้สร้างฟังก์ชัน __doPostBack บนหน้าคุณต้องแทรกตัวควบคุมเพื่อบังคับให้เป็นเช่นนี้:

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

1

เกี่ยวกับ:

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

button.click();

มันควรจะเป็นเช่น:

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

โดยที่ formID คือรหัสควบคุม ASP.NET ในไฟล์. aspx


0

เพิ่มบรรทัดนี้เพื่อโหลดหน้าเว็บหากคุณได้รับข้อผิดพลาดที่คาดหวังจากวัตถุ

ClientScript.GetPostBackEventReference(this, "");


0

ลองสิ่งนี้:

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

หรือสิ่งนี้

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

ใช้คุณสมบัติ OnClientClick ของปุ่มเพื่อเรียกใช้ฟังก์ชัน JavaScript ...



0

โปรดลองสิ่งนี้:

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

ddlVoucherType เป็นตัวควบคุมที่การเปลี่ยนแปลงดัชนีที่เลือกจะเรียก ... และคุณสามารถใส่ฟังก์ชั่นใด ๆ ในการเปลี่ยนแปลงดัชนีที่เลือกของตัวควบคุมนี้


0

วิธีที่ง่ายที่สุดและดีที่สุดในการบรรลุเป้าหมายนี้คือการใช้onmouseup()เหตุการณ์ JavaScript แทนonclick()

ด้วยวิธีนี้คุณจะเริ่มการทำงานของ JavaScript หลังจากที่คุณคลิกและจะไม่รบกวนOnClick()กิจกรรมASP


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

ดังนั้นไม่จำเป็นต้องเรียกใช้รหัสพิเศษ


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.