Gọi hàm JavaScript từ CodeBehind


150

Ai đó có thể cung cấp các ví dụ hay về cách gọi hàm JavaScript từ CodeBehind và ngược lại không?


Dưới đây là bài viết chi tiết codepedia.info/ bằng cách sử dụng có và không có Bảng cập nhật Ajax
Satinder singh

Câu trả lời:


206

Bạn có thể thử điều này:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);

41
Tôi sẽ dùng ScriptManager.RegisterStartupScript (Trang, typeof (Trang), "somekey", script, true); tiếp cận. Nó hoạt động trong quá trình postback một phần là tốt.
ndmptn

10
1. Đôi khi Page.ClientScript.RegisterClientScriptBlockđược yêu cầu thay vì xem bài đăng này để biết thông tin . 2. Điều đáng nói là để MyFactor () hoạt động, MyFunction () phải được xác định trước các thẻ biểu mẫu hoặc bên trong chúng, nhưng KHÔNG phải sau thẻ kết thúc </ form> (nếu không, lỗi dự kiến ​​của đối tượng sẽ xảy ra)
BornToCode

2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);làm. this.GetType()ném một lỗi cho tôi.
SearchForKnowledge

2
Điều này không hoạt động khi mã được bọc bằng một asp:UpdatePanelvà được viết trong một sự kiện nút. Điều này gây ra các trang để postback.
Senura Dissanayake

52

C # sang JavaScript: bạn có thể đăng ký khối tập lệnh để chạy trên trang như sau:

ClientScript.RegisterStartupScript(GetType(),"hwa","alert('Hello World');",true);

thay thế alert()một phần với tên chức năng của bạn.

Để gọi phương thức C # từ JavaScript, bạn có thể sử dụng ScriptManagerhoặc jQuery. Cá nhân tôi sử dụng jQuery. Bạn cần trang trí phương thức mà bạn muốn gọi từ JavaScript bằng WebMethodthuộc tính. Để biết thêm thông tin về cách gọi phương thức C # (được gọi PageMethod) từ jQuerybạn có thể tham khảo bài đăng của Dave Ward .


51

Gọi một hàm JavaScript từ mã phía sau

Bước 1 Thêm mã Javascript của bạn

<script type="text/javascript" language="javascript">
    function Func() {
        alert("hello!")
    }
</script>

Bước 2 Thêm 1 Trình quản lý tập lệnh trong webForm của bạn và Thêm 1 nút nữa

Bước 3 Thêm mã này vào sự kiện nhấn nút của bạn

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);

Khi cố gắng làm điều này khi một hàng GridView được nhấp, nó chỉ hoạt động khi sử dụng ScriptManagernhư trong câu trả lời này, không phải Page.ClientScriptnhư trong các câu trả lời khác. Có thể liên quan đến asp:UpdatePanelbình luận dưới câu trả lời được chấp nhận.
Chris

16

Bạn không thể làm điều này trực tiếp. Trong WebForms tiêu chuẩn, JavaScript được trình duyệt và C # giải thích bởi máy chủ. Những gì bạn có thể làm để gọi một phương thức từ máy chủ bằng JavaScript là.

Như thế này:

Bước 1

public partial class Products : System.Web.UI.Page 
{ 
    [System.Web.Services.WebMethod()] 
    [System.Web.Script.Services.ScriptMethod()] 
    public static List<Product> GetProducts(int cateogryID) 
    {
        // Put your logic here to get the Product list 
    }

Bước 2: Thêm một ScriptManagervàoPage

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

Bước 3: Gọi phương thức bằng JavaScript

function GetProductsByCategoryID(categoryID)
{
    PageMethods.GetProducts(categoryID, OnGetProductsComplete);
}

Hãy xem liên kết này.

Để gọi một hàm JavaScript từ máy chủ, bạn có thể sử dụng RegisterStartupScript:

ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);

Nơi nào bạn đặt bước một trong phân cấp tệp MVC 3?
Cướp

@Rob GetProducts()Hàm này chỉ là một hàm đằng sau mã nằm trong bộ điều khiển trong ứng dụng MVC, vì vậy các thẻ nằm trên bất kỳ chức năng nào bạn muốn đặt trong bộ điều khiển mà bạn dự định gọi từ JavaScript .
vapcguy

15

Nếu bạn cần gửi một giá trị như một tham số.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);

8

Một điều khác bạn có thể làm là tạo một biến phiên được đặt trong mã phía sau và sau đó kiểm tra trạng thái của biến đó và sau đó chạy javascript của bạn. Điều tốt là điều này sẽ cho phép bạn chạy tập lệnh của mình ngay tại nơi bạn muốn thay vì phải tìm ra nếu bạn muốn nó chạy trong DOM hoặc trên toàn cầu.

Một cái gì đó như thế này: Mã phía sau:

Session["newuser"] = "false" 

Trong javascript

var newuser = '<%=Session["newuser"]%>';
 if (newuser == "yes")
     startTutorial();  

7

Bạn không thể. Codebehind đang chạy trên máy chủ trong khi JavaScript đang chạy trên máy khách.

Tuy nhiên, bạn có thể thêm <script type="text/javascript">someFunction();</script>vào đầu ra của mình và do đó khiến hàm JS được gọi khi trình duyệt phân tích cú pháp đánh dấu của bạn.


65
"Bạn không thể. Nhưng đây là cách bạn làm điều đó."

3
Tôi sẽ không xem xét việc gọi một phương thức từ mã phía máy chủ vì bạn không có cách thực sự để nhận giá trị trả về hoặc chỉ định gọi lại.
ThiefMaster

8
Aw, chắc chắn bạn có thể. Bạn có thể gọi lại một bài đăng từ javascript hoặc AJAX của bạn trở lại. Tôi nghĩ đó là buồn cười; Tôi có xu hướng làm điều tương tự - "Không, điều đó là không thể. Thậm chí không ai muốn làm điều đó nếu họ có thể." sau đó vài phút "Vì vậy, đây là cách chúng ta sẽ làm điều đó."

7

Bạn có thể sử dụng nghĩa đen:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));

1
Nhưng không phải điều này chỉ thêm một tập lệnh vào bộ nhớ, nó cũng không thực sự chạy nó sao?
Fandango68

5

Mã IIRC Phía sau được biên dịch bên máy chủ và javascript được giải thích phía máy khách. Điều này có nghĩa là không có liên kết trực tiếp giữa hai.

Mặt khác, những gì bạn có thể làm là để máy khách và máy chủ liên lạc thông qua một công cụ tiện lợi có tên AJAX. http://en.wikipedia.org/wiki/Asynyncous_JavaScript_and_XML


5

Hãy thử điều này trong Code đằng sau và nó sẽ hoạt động 100%

Viết dòng mã này vào bạn Mã đằng sau tệp

string script = "window.onload = function() { YourJavaScriptFunctionName(); };";
ClientScript.RegisterStartupScript(this.GetType(), "YourJavaScriptFunctionName", script, true);

Và đây là trang web mẫu

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>

4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>

8
Thêm một số lời giải thích
ketan

4

Ví dụ làm việc: _

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage2.Master" AutoEventWireup="true" CodeBehind="History.aspx.cs" Inherits="NAMESPACE_Web.History1" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>


 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 

        <script type="text/javascript">

            function helloFromCodeBehind() {
                alert("hello!")
            }


        </script>

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

 <div id="container"  ></div>

</asp:Content>

Mã ẩn

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace NAMESPACE_Web
{
    public partial class History1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            ScriptManager.RegisterStartupScript(this, GetType(), "displayalertmessage", "helloFromCodeBehind()", true);
        }

    }
}

Cạm bẫy có thể xảy ra: -

  1. Mã và HTML có thể không nằm trong cùng một không gian tên
  2. CodeBehind="History.aspx.cs" đang chỉ đến trang sai
  3. Hàm JS có một số lỗi

3

Tôi đã nhận thấy rất nhiều câu trả lời ở đây đang sử dụng ScriptManager.RegisterStartupScriptvà nếu bạn sẽ làm điều đó, đó không phải là cách đúng đắn để làm điều đó. Cách đúng là sử dụng ScriptManager.RegisterScriptBlock([my list of args here]). Lý do là bạn chỉ nên sử dụng RegisterStartupScript khi trang của bạn tải (do đó có tên là RegisterStartupScript).

Trong VB.NET:

ScriptManager.RegisterClientScriptBlock(Page, GetType(String), "myScriptName" + key, $"myFunctionName({someJavascriptObject})", True)

trong C #:

ScriptManager.RegisterClientScriptBlock(Page, typeof(string), "myScriptName" + key, $"myFunctionName({someJavascriptObject})", true);

Tất nhiên, tôi hy vọng không cần phải nói rằng bạn cần thay thế khóa bằng mã định danh khóa của mình và có lẽ nên chuyển tất cả điều này thành một phụ / hàm / phương thức và truyền vào khóa và someJavascriptObject (nếu phương thức javascript của bạn yêu cầu đối số của bạn là đối tượng javascript).

Tài liệu MSDN:

https://msdn.microsoft.com/en-us/l Library / bb338357 (v = vs.110) .aspx


3
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);

sử dụng chức năng của bạn là đủ


2
Bạn có thể giải thích câu trả lời của bạn nhiều hơn một chút?
maxpaj

1
Tham số "JavaFunction" này là gì? Chúng ta có thể thêm bất cứ điều gì trong đó? Những gì cần phải có trong lập luận đó?
Senura Dissanayake

1
@SenuraDissanayake Đó là một tiêu đề - vâng, nó có thể là bất cứ điều gì & không thực sự quan trọng.
vapcguy

2

Đây là cách tôi đã thực hiện nó.

Đánh dấu HTML hiển thị nhãn và điều khiển nút như sau.

<body> 
  <form id="form1" runat="server"> 
  <div> 
    <asp:Label ID="lblJavaScript" runat="server" Text=""></asp:Label> 
    <asp:Button ID="btnShowDialogue" runat="server" Text="Show Dialogue" /> 
  </div> 
  </form> 
</body>

Hàm JavaScript có ở đây.

<head runat="server"> 
  <title>Calling javascript function from code behind example</title> 
  <script type="text/javascript"> 
    function showDialogue() { 
      alert("this dialogue has been invoked through codebehind."); 
    } 
  </script> 
</head>

Mã phía sau để kích hoạt chức năng JavaScript là ở đây.

lblJavaScript.Text = "<script type='text/javascript'>showDialogue();</script>";

1

cái này hiệu quả với tôi

object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);

1

Vì tôi không thể tìm ra giải pháp có mã phía sau, bao gồm thử ClientScriptScriptManagergiống như mutanic và Orlando Herrera đã nói trong câu hỏi này (cả hai đều thất bại), tôi sẽ cung cấp giải pháp mặt trước sử dụng các lần nhấp nút cho người khác nếu họ ở cùng vị trí với tôi. Điều này làm việc cho tôi:

Đánh dấu HTML:

<asp:button ID="myButton" runat="server" Text="Submit" OnClientClick="return myFunction();"></asp:button>

JavaScript:

function myFunction() {
    // Your JavaScript code
    return false;
}

Tôi chỉ đơn giản là sử dụng một nút ASP.NET sử dụng thuộc OnClientClicktính, kích hoạt các chức năng kịch bản phía máy khách, đó là JavaScript. Những điều quan trọng cần lưu ý ở đây là việc sử dụng returntừ khóa trong lệnh gọi hàm và trong chính hàm đó. Tôi đã đọc các tài liệu không sử dụng returnnhưng vẫn nhận được nút bấm để hoạt động - bằng cách nào đó nó không hoạt động với tôi. Câu return false;lệnh trong hàm chỉ định một postback KHÔNG nên xảy ra. Bạn cũng có thể sử dụng tuyên bố đó trong OnClientClicktài sản:OnClientClick="myFunction() return false;"


0

Tôi đã sử dụng ScriptManager trong Code Phía sau và nó hoạt động tốt.

ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "CallMyFunction", "confirm()", true);

Nếu bạn đang sử dụng UpdatePanel trong ASP Frontend. Sau đó, nhập tên UpdatePanel và 'tên hàm' được xác định bằng các thẻ script.


0

Cảm ơn "Liko", chỉ cần thêm một nhận xét cho câu trả lời của anh ấy.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);

Đã thêm dấu ngoặc đơn ( ') vào biến, nếu không nó sẽ đưa ra thông báo lỗi:

string jsFunc = "myFunc('" + MyBackValue + "')";

-1

Bạn không thể gọi một hàm Javascript từ CodeBehind, vì tệp CodeBehind chứa mã thực thi phía máy chủ trên máy chủ web. Mã Javascript thực thi trong trình duyệt web ở phía máy khách.


1
Bạn không thể gọi một hàm javascript trực tiếp như trong myCoolJavascriptFunction (javascriptFunctionArss); trên máy chủ, nhưng bạn có thể gọi một hàm javascript từ mã phía sau trong trang WebForms.
cr1pto

đồng ý với cloudstrifebro
Khurram Ishaque

-1

Bạn có thể hiển thị các phương thức C # trên các trang mã để có thể gọi được thông qua JavaScript bằng cách sử dụng thuộc tính ScriptMethod .

Bạn không thể gọi JavaScript từ CodeBehind - mã đó chỉ tồn tại trên máy khách.

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.