CodeBehindからのJavaScript関数の呼び出し


回答:


206

あなたはこれを試すことができます:

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

41
ScriptManager.RegisterStartupScript(Page、typeof(Page)、 "somekey"、script、true);を選択します。アプローチ。部分的なポストバック中にも機能します。
rdmptn 2013

10
1.場合によってPage.ClientScript.RegisterClientScriptBlockは、代わりに この投稿を参照してください。2. MyFunction()が機能するためには、MyFunction()をフォームタグの前または内部で定義する必要がありますが、</ form>終了タグの後には定義しない必要があります(そうでない場合、オブジェクトの予期されるエラーが発生します)発生する)
BornToCode

2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);動作します。this.GetType()エラーが発生します。
SearchForKnowledge 2015

2
これは、コードがでラップasp:UpdatePanelされ、ボタンイベントに書き込まれた場合は機能しません。これにより、ページがポストバックされます。
Senura Dissanayake

52

C#からJavaScript:次のように、スクリプトブロックを登録してページで実行できます。

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

alert()partを関数名に置き換えます。

JavaScriptからC#メソッドを呼び出すには、ScriptManagerまたはを使用できますjQuery。個人的に使用していますjQuery。JavaScriptから呼び出すメソッドをWebMethod属性で装飾する必要があります。C#メソッド(と呼ばれるPageMethod)の呼び出しに関する詳細についてjQueryは、Dave Wardの投稿を参照してください。


51

コードビハインドからJavaScript関数を呼び出す

ステップ1 JavaScriptコードを追加する

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

手順2 webForm に1つのスクリプトマネージャーを追加し、1つのボタンも追加する

手順3このコードをボタンクリックイベントに追加します

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

GridView行がクリックされたときにこれを実行しようとするScriptManagerと、この回答のように使用した場合にのみ機能Page.ClientScriptし、他の回答では機能しません。asp:UpdatePanel受け入れられた回答の下のコメントに関連している可能性があります。
Chris

16

これを直接行うことはできません。標準のWebフォームでは、JavaScriptはブラウザによって解釈され、C#はサーバーによって解釈されます。JavaScriptを使用してサーバーからメソッドを呼び出すためにできることは次のとおりです。

  • ターゲットメソッドのWebMethodようattributeに使用します。
  • ScriptManager設定をEnablePageMethodsとして追加しますtrue
  • オブジェクトを介してメソッドを呼び出すJavaScriptコードを追加しますPageMethods

このような:

ステップ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 
    }

ステップ2:追加するScriptManagerにはPage

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

ステップ3:JavaScriptを使用してメソッドを呼び出す

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

このリンクを見てください。

サーバーからJavaScript関数を呼び出すには、次を使用できますRegisterStartupScript

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

ステップ1をMVC 3ファイル階層のどこに配置しますか?
Rob

@Rob GetProducts()関数は、MVCアプリのコントローラーに存在する分離コード関数にすぎないため、JavaScriptから呼び出す予定のコントローラーに配置する関数の上にタグが配置されます。 。
vapcguy 2018年

15

パラメータとして値を送信する必要がある場合。

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

8

もう1つの方法は、コードビハインドで設定されるセッション変数を作成し、その変数の状態を確認して、JavaScriptを実行することです。これにより、スクリプトをDOMで実行するかグローバルで実行するかを判断する必要がなく、必要な場所でスクリプトを実行できるようになります。

このようなもの:コードビハインド:

Session["newuser"] = "false" 

JavaScriptで

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

7

できません。JavaScriptがクライアントで実行されている間、分離コードはサーバーで実行されます。

ただし、<script type="text/javascript">someFunction();</script>出力に追加して、ブラウザーがマークアップを解析しているときにJS関数が呼び出されるようにすることができます。


65
「あなたはできません。しかし、これがあなたのやり方です。」

3
戻り値を取得したり、コールバックを指定したりするための実際の方法がないため、サーバーサイドコードからメソッドを呼び出すことは考慮しません。
ThiefMaster 2011

8
できます。JavaScriptまたはAJAXからポストバックを呼び出すことができます。面白いと思った。私は同じことをする傾向があります-「いいえ、それは不可能です。もし可能なら誰もそれをしたくありません。」それから数分後、「これが私たちがそれを行う方法です。」

7

リテラルを使用できます:

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

1
しかし、これはスクリプトをメモリに追加するだけではなく、実際には実行しませんか?
Fandango68


5

コードビハインドでこれを試してください、それは100%機能します

このコード行をコードビハインドファイルに記述します

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

そして、これはウェブフォームページです

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

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

8
説明を追加
ケタン

4

作業例:_

<%@ 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>

コードビハインド

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

    }
}

考えられる落とし穴:-

  1. コードとHTMLが同じ名前空間にない可能性があります
  2. CodeBehind="History.aspx.cs" 間違ったページを指しています
  3. JS関数にエラーがあります

3

私はここで多くの答えが使用されていることに気づきました、ScriptManager.RegisterStartupScriptそしてあなたがそうするつもりなら、それはそれを行う正しい方法ではありません。正しい方法はを使用することScriptManager.RegisterScriptBlock([my list of args here])です。その理由は、ページが読み込まれるときにRegisterStartupScriptのみを使用する必要があるためです(そのため、RegisterStartupScriptという名前です)。

VB.NETの場合:

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

C#の場合:

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

もちろん、keyをキー識別子で置き換える必要があることは言うまでもありません。おそらく、これらすべてをsub / function / methodに移動し、keyとsomeJavascriptObjectを渡す必要があります(javascriptメソッドで引数がJavaScriptオブジェクト)。

MSDNドキュメント:

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


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

関数を使用するだけで十分です


2
あなたの答えをもう少し説明できますか?
maxpaj 2018

1
この「JavaFunction」パラメーターとは何ですか?何か追加できますか?その議論には何が必要ですか?
Senura Dissanayake

1
@SenuraDissanayakeタイトルです。そうです。何でもかまいませんし、重要ではありません。
vapcguy

2

これが私がやった方法です。

ラベルとボタンコントロールを示すHTMLマークアップは次のとおりです。

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

JavaScript関数はこちらです。

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

JavaScript関数をトリガーするコードビハインドはこちらです。

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

1

これは私のために働く

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

1

コードの背後にある解決策を見つけることができなかったのでClientScriptScriptManager mutanicとオーランド・エレーラのように(彼らは両方とも何らかの形で失敗した)この質問で述べて、私があれば他の人に、ボタンのクリックを利用して、フロントエンドのソリューションを提供します彼らは私と同じ立場にいます。これは私のために働きました:

HTMLマークアップ:

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

JavaScript:

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

私はOnClientClick、JavaScriptであるクライアント側のスクリプト関数を起動するプロパティを利用するASP.NETボタンを単に使用しています。ここで注意すべき重要な点returnは、関数呼び出しおよび関数自体でのキーワードの使用です。使用していないドキュメントを読みましたreturnが、ボタンをクリックしても機能します-どういうわけか機能しませんでした。return false;関数内のステートメントは、ポストバックが発生してはならないことを指定しています。OnClientClickプロパティでそのステートメントを使用することもできます。OnClientClick="myFunction() return false;"


0

コードビハインドでScriptManagerを使用しましたが、正常に機能しました。

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

ASPフロントエンドでUpdatePanelを使用している場合。次に、UpdatePanel名とスクリプトタグで定義された「関数名」を入力します。


0

「リコ」に感謝し、彼の答えにコメントを追加してください。

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

'変数に一重引用符()を追加しました。そうしないと、エラーメッセージが表示されます。

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

-1

CodeBehindファイルにはWebサーバーでサーバー側を実行するコードが含まれているため、CodeBehindからJavaScript関数を呼び出すことはできません。JavaScriptコードは、クライアント側のWebブラウザーで実行されます。


1
myCoolJavascriptFunction(javascriptFunctionArgs);のようにJavaScript関数を直接呼び出すことはできません。サーバーでは、WebFormsページのコードビハインドからJavaScript関数を呼び出すことができます。
cr1pto

クラウドストライフェブロに同意
Khurram Ishaque

-1

分離コードページでC#メソッドを公開し、ScriptMethod属性を使用してJavaScriptから呼び出し可能にすることができます

CodeBehindからJavaScriptを呼び出すことはできません。そのコードはクライアントにのみ存在します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.