2009-04-25 37 views
11

Tôi muốn gọi hàm javascript từ điều khiển aspx. Ví dụ, giả sử tôi có:Gửi đối số cho hàm JavaScript từ mã sau

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
<title>Untitled Page</title> 
<script type="text/javascript"> 
    function test(x, y) 
    { 

    } 
</script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="Button1" runat="server" Text="Button" 
     onclick="Button1_Click"/> 
    </div> 
    </form> 
</body> 
</html> 

và trong các mã sau:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    // do stuff (really going to a database to fill x and y) 
    int[] x = new int[] { 1, 2, 3, 4, 5 }; 
    int[] y = new int[] { 1, 2, 3, 4, 5 }; 

    // call javascript function as test(x,y); 
} 

Có cách nào để làm điều đó?

+0

Câu hỏi này tương tự, nhưng không hoàn toàn giống nhau. Trong câu hỏi của tôi, tôi đang cụ thể hơn về cách chuyển đối số cho hàm javascript và cung cấp mã ví dụ. Tôi quan tâm đến cơ chế cụ thể của nó. –

Trả lời

10

Bạn có thể sử dụng phương pháp Page.ClientScript.RegisterStartupScript.

+0

Làm thế nào nó hoạt động? Tôi cần phải gọi một hàm JavaScript từ codebehind mà không có bất kỳ tham số nào, nhưng tôi không thấy cách sử dụng nó: S – PedroC88

0

Tôi nghĩ bạn muốn thực thi javascript serverside chứ không phải trong trình duyệt sau khi đăng lại, phải không?

Đó là không thể thực hiện như xa như tôi biết

Nếu bạn chỉ muốn có được nó thực hiện sau khi postback, bạn có thể làm một cái gì đó như thế này:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>"); 
+0

Tôi đang tìm kiếm thực thi phía máy khách sau khi đăng lại, xin lỗi vì không rõ ràng hơn. Vì vậy, với phương pháp này, điều này sẽ gọi một kịch bản hiện có trên trang, đúng không? –

+0

có một chức năng javascript được gọi là "kiểm tra" sẽ được thực hiện ngay lập tức sau khi postback. Điều này hữu ích khi hiển thị cửa sổ bật lên cảnh báo cho người dùng. từ googling: "ClientScript.RegisterClientScriptBlock được sử dụng để đảm bảo tập lệnh cụ thể được bao gồm trong phần tiêu đề của trang. Loại và thông số chính giúp đảm bảo rằng tập lệnh nhất định chỉ được bao gồm một lần ngay cả khi RegisterClientScriptBlock được gọi nhiều lần cho cùng một tập lệnh (được cung cấp cùng loại và khóa). " –

+0

Tôi dường như đã đăng sai phương pháp trước đây. Bạn cần "RegisterClientScriptBlock". (Tôi đã chỉnh sửa nó trong bài viết của tôi) –

2
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>"); 

phá vỡ từ khóa kịch bản vì Trình biên dịch VStudio/asp.net không thích nó

6

Một số thứ khác tôi đã phát hiện ra:

Bạn không thể vượt qua trực tiếp trong một mảng như:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", 
"<script>test("+x+","+y+");</script>"); 

vì đó gọi ToString() phương pháp của x và y, trong đó trả "System.Int32 []", và rõ ràng Javascript không thể sử dụng . Tôi đã phải vượt qua trong mảng như chuỗi, như "[1,2,3,4,5]", vì vậy tôi đã viết một phương pháp trợ giúp để làm việc chuyển đổi.

Ngoài ra, có một sự khác biệt giữa this.Page.ClientScript.RegisterStartupScript() và this.Page.ClientScript.RegisterClientScriptBlock() - trước đây đặt kịch bản ở cuối trang, mà tôi cần để trở thành có thể truy cập các điều khiển (như với document.getElementByID). RegisterClientScriptBlock() được thực hiện trước khi các thẻ được hiển thị, vì vậy tôi thực sự gặp phải lỗi Javascript nếu tôi sử dụng phương thức đó.

http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html bao gồm sự khác biệt giữa hai loại khá tốt.

Dưới đây là ví dụ hoàn chỉnh tôi đã đưa ra:

// code behind 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    int[] x = new int[] { 1, 2, 3, 4, 5 }; 
    int[] y = new int[] { 1, 2, 3, 4, 5 }; 

    string xStr = getArrayString(x); // converts {1,2,3,4,5} to [1,2,3,4,5] 
    string yStr = getArrayString(y); 

    string script = String.Format("test({0},{1})", xStr, yStr); 
    this.Page.ClientScript.RegisterStartupScript(this.GetType(), 
    "testFunction", script, true); 
    //this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), 
    //"testFunction", script, true); // different result 
} 
private string getArrayString(int[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < array.Length; i++) 
    { 
     sb.Append(array[i] + ","); 
    } 
    string arrayStr = string.Format("[{0}]", sb.ToString().TrimEnd(',')); 
    return arrayStr; 
} 

//aspx page 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Untitled Page</title> 
    <script type="text/javascript"> 
    function test(x, y) 
    { 
     var text1 = document.getElementById("text1") 
     for(var i = 0; i<x.length; i++) 
     { 
      text1.innerText += x[i]; // prints 12345 
     } 
     text1.innerText += "\ny: " + y; // prints y: 1,2,3,4,5 

    } 

    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="Button1" runat="server" Text="Button" 
     onclick="Button1_Click" /> 
    </div> 
    <div id ="text1"> 
    </div> 
    </form> 
</body> 
</html> 
+3

Nếu bạn muốn chuyển đối tượng/mảng vào javascript khách hàng của mình, bạn có thể xem xét ASP.NET & JSON (sử dụng một trường ẩn trong HTML của bạn). Một hướng dẫn tốt về ASP.NET & JSON có tại đây: http://blogs.msdn.com/rakkimk/archive/2009/01/30/asp-net-json-serialization-and-deserialization.aspx – pyrocumulus

+0

Cảm ơn, tôi ' ll hãy xem nó. –

+0

đẹp, gấp 10 lần –

0

Nếu bạn quan tâm trong việc xử lý Javascript trên máy chủ, có một thư viện mã nguồn mở mới gọi là Jint cho phép bạn thực hiện các máy chủ Javascript bên. Về cơ bản nó là một trình thông dịch Javascript được viết bằng C#. Tôi đã thử nghiệm nó và cho đến nay nó trông khá hứa hẹn.

Dưới đây là mô tả từ trang web:

khác biệt với động cơ kịch bản khác:

Jint là khác nhau vì nó không sử dụng CodeDomProvider kỹ thuật mà là sử dụng biên soạn dưới mui xe và do đó dẫn đến rò rỉ bộ nhớ vì không thể bốc dỡ các assembly được biên dịch . Hơn nữa, sử dụng kỹ thuật này ngăn việc sử dụng các loại động biến theo cách JavaScript, cho phép linh hoạt hơn trong các tập lệnh của bạn. Ngược lại, Jint nhúng logic phân tích cú pháp của riêng nó và thực sự diễn giải các tập lệnh. Jint sử dụng thư viện ANTLR nổi tiếng (http://www.antlr.org) cho mục đích này. Vì nó sử dụng Javascript làm ngôn ngữ mà bạn không phải học một ngôn ngữ mới, nó có được chứng minh là rất mạnh mẽ cho mục đích kịch bản và bạn có thể sử dụng một số trình chỉnh sửa văn bản cho cú pháp kiểm tra.

1
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Call java script function on Code behind</title> 
    <script type="text/javascript"> 
    function abc() 
    { 
     var a=20; 
     var b=30; 
     alert("you enter"+a+":"+b); 
    } 
    </script> 
</head> 

cs đang

protected void Page_Load(object sender, EventArgs e) 
{ 
    TextBox2.Attributes.Add("onkeypress", "return abc();"); 
} 

thử này

3

bao gồm quản lý kịch bản

mã sau chức năng

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true); 
0
<head> 
    <script type="text/javascript"> 

     function test(x, y) 
     { 
      var cc = ""; 
      for (var i = 0; i < x.length; i++) 
      { 
       cc += x[i]; 
      } 
      cc += "\ny: " + y; 
      return cc; 
     } 

    </script> 



</head> 

<body> 

    <form id="form1" runat="server"> 

     <asp:Button ID="Button1" runat="server" Text="Button" /> 

     <p> 
      <asp:TextBox ID="TextBox1" Name="TextBox1" runat="server" AutoPostBack="True" TextMode="MultiLine"></asp:TextBox> 
     </p> 



    </form> 
</body> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    int[] x = new int[] { 1, 2, 3, 4, 5 }; 
    int[] y = new int[] { 1, 2, 3, 4, 5 }; 

    string xStr = getArrayString(x); // converts {1,2,3,4,5} to [1,2,3,4,5] 
    string yStr = getArrayString(y); 

    string script = String.Format(" var y = test({0},{1}) ; ", xStr, yStr); 
    script += String.Format(" document.getElementById(\"TextBox1\").value = y "); 

    this.Page.ClientScript.RegisterStartupScript(this.GetType(), "testFunction", script, true); 
    // this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "testFunction", script, true); // different result 
} 




private string getArrayString(int[] array) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < array.Length; i++) 
    { 
     sb.Append(array[i] + ","); 
    } 
    string arrayStr = string.Format("[{0}]", sb.ToString().TrimEnd(',')); 
    return arrayStr; 
} 
Các vấn đề liên quan