web-dev-qa-db-ja.com

JavaScriptを使用してクライアント側からサーバー側で非静的メソッドを呼び出す

Javascript(aspx)を使用してクライアント側からサーバー側(aspx.cs)の非静的メソッドを呼び出す方法を教えてください。

私の知る限り、クライアント側からサーバー側で静的メソッドを呼び出すことができます...

サーバ側:

 [WebMethod]
 public static void method1()
 {
 }

クライアント側:

 <script language="JavaScript">
     function keyUP() 
     {
         PageMethods.method1();
     }
 </script>
 <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
 </asp:ScriptManager>

できます。クライアント側から非静的メソッドを呼び出すにはどうすればよいですか?

18
Pramulia

分離コードページの代わりに単純な.asmxページを使用すると、静的制約を回避できます。

1)AJAX ASP.NETテンプレートを使用して新しいWebサイトを開きます(必要な参照をweb.configに入れます)

2)SIMPLESERVICE.ASMX-新しい.asmx Webサービスを追加します(私はSimpleService.asmxと呼んでいます)[System.Web.Script.Services.ScriptSerive]装飾とSimpleServiceクラスがWebサービスを実装していることに注目してください。

<%@ WebService Language="C#" Class="SimpleService" %>

using System;
using System.Web.Services;

[System.Web.Script.Services.ScriptService]
public class SimpleService : WebService
{
    [WebMethod]
    public string GetMessage(string name)
    {
        return "Hello <strong>" + name + "</strong>, the time here is: " + DateTime.Now.ToShortTimeString();
    }
} 

3)DEFAULT.ASPX-これを使用するには、スクリプトマネージャーでサービスを参照し、電源を切って実行します。私のJavaScriptでは、class.method-SimpleService.GetMessageを呼び出します。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
     <script language="javascript" type="text/javascript">       
        function callServer() {
            SimpleService.GetMessage($get("Name").value, displayMessageCallback);
        }

        function displayMessageCallback(result) {
            $get("message").innerHTML = result;
        } 
    </script>


</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" >
            <Services>
                <asp:ServiceReference Path="~/SimpleService.asmx" />
            </Services>
        </asp:ScriptManager>
        <div>
        </div>
        <h1>Hello World Example</h1>

        <div>
            Enter Name: <input id="Name" type="text" />

            <a href="javascript:callServer()">Call Server</a>

            <div id="message"></div>
        </div>  
    </form>
</body>
</html>

私はスコット・グーから見つけた例を使用しました ここに見つかりました

17
shawn deutch

いいえ、クライアント側から非静的メソッド自体を呼び出すことはできません。私は一度試してみましたが、醜いです(jQuery ajaxも使用しました)。クエリ文字列パラメーターとしてメソッド名が付加されたajaxを使用してページを呼び出し、サーバー側でパラメーターを確認して関連するメソッドを呼び出します。しかし、私があなたに言ったように、それはかなり醜いです:(

$.ajax({'/mypage.aspx?m=mymethod',......}); //this is not correct syntax

サーバー側:

protected void Page_Load(object sender, EventArgs e)
{
    if(!Request.QueryString.HasKeys() || 
                string.IsNullOrEmpty(Request.QueryString["m"]))
    {
        //return error or something relevant to your code
    }
    var m = Request.QueryString["m"];

    switch(m)
    {
        case "a":
        a();
        break;
        .....
        .....
    }
}
7
TheVillageIdiot

C#

public string LoadString() {
    return "my string";
}

JS/jQuery

$('#txt').val(<%= LoadString() %>);
2
Mike

実際には、このように非静的メソッドを呼び出すことはできません。

PageMethodを呼び出すときは、基本的に特別なWebサービスを呼び出しています。この機能は、同じページの静的メソッドでのみ機能します。

1
John Saunders

同じ関数を使用して呼び出す場合は、次のコードを使用できます。

[WebMethod]
public static void method1()
{
    ClassOfNonStaticFunction obj = new ClassOfNonStaticFunction();
    obj.yourFunctionName(ParametersIfAny);
}
1
Manoj Bhardwaj

pramuliaへの回答として、クライアントサイドからの引数を持つ関数が必要であると思います-> CallServer(arg1、arg2)

<%@ Page Language="C#" AutoEventWireup="true"  %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html >
<head runat="server">
    <title>Client Callbacks</title>
    <script runat="server">
        public void RaiseCallbackEvent(String eventArgument)
        {
            // Processes a callback event on the server using the event
            // argument from the client.
        }

        public string GetCallbackResult()
        {
            // Returns the results of a callback event to the client.
            string dateString = DateTime.Now.ToLongDateString();

            return dateString;
        }

        void Page_Load(object sender, EventArgs e)
        {
            ClientScriptManager cm = Page.ClientScript;
            String cbReference = cm.GetCallbackEventReference(this, "arg",
                "ReceiveServerData", "");
            String callbackScript = "function CallServer(arg, context) {" +
                cbReference + "; }";
            cm.RegisterClientScriptBlock(this.GetType(),
                "CallServer", callbackScript, true);
        }
    </script>
    <script type="text/javascript">
        function ReceiveServerData(arg, context) {
            Message.innerText = "Date from server: " + arg;
        }
    </script>
</head>
<body>
    <h2>Client Callbacks Without Postbacks</h2>
    <form id="form1" runat="server">
       <input type="button" value="Callback" 
           onclick="CallServer('1', alert('Callback sent to Server'))" />
       <br />
       <span id="Message"></span>
   </form>
</body>
</html>
0
Kubi

誰かがこれを読む場合に備えて、私は最終的に隠しフィールドを使用することになりました。関数の下でc#に値を設定して、それをJavaScriptで読み取ることができます。

0
Bbb