2011-08-17 14 views
29

誰かがJavaScriptを使用してサーバー側のC#メソッドを呼び出す方法を知っていますか?私がする必要があるのは、[キャンセル]が選択されている場合はインポートを停止するか、[OK]を選択した場合はインポートを続行することです。JavaScriptを使用してASP.NETのC#メソッドを呼び出す方法

private void AlertWithConfirmation()    
{     
    Response.Write(
     "<script type=\"text/javascript\">" +  
      "if (window.confirm('Import is currently in progress. Do you want to continue with importation? If yes choose OK, If no choose CANCEL')) {" +  
       "window.alert('Imports have been cancelled!');" +  
      "} else {" + 
       "window.alert('Imports are still in progress');" +  
      "}" +  
     "</script>"); 
} 
+0

最も簡単な方法は、おそらく、jQueryまたは関連するフレームワークを使用してAJAXリクエストをサーバーに送り返すことです。http://api.jquery.com/jQuery.ajax/キャンセルブロックでリクエストを作成し、サーバ。あなたはもっと多くの情報が必要な場合は尋ねてください。 – timothyclifford

答えて

61

PageMethodは、Aspのためのより簡単で迅速なアプローチです。Net AJAX AJAXの力を引き出して、Webアプリケーションのユーザーエクスペリエンスとパフォーマンスを簡単に改善できます。 AJAXで私が気に入っている最も良いものの一つがPageMethodです。

PageMethodは、サーバーサイドページのメソッドをJavaスクリプトで公開する方法です。これは、ゆっくりと迷惑なポストバックを使わずに、たくさんの機会をたくさんもたらすことができます。

この記事では、ScriptManagerとPageMethodの基本的な使い方を示しています。この例では、ユーザー登録フォームを作成しています。このフォームでは、ユーザーは自分の電子メールアドレスとパスワードに対して登録することができます。

<body> 
    <form id="form1" runat="server"> 
    <div> 
     <fieldset style="width: 200px;"> 
      <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label> 
      <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> 
      <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label> 
      <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox> 
     </fieldset> 
     <div> 
     </div> 
     <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" /> 
    </div> 
    </form> 
</body> 
</html> 

ページを設定するには、まずページ上のスクリプトマネージャーをドラッグする必要があります。

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

また、EnablePageMethods="true"に変更があります。
これはScriptManagerに対して、クライアント側からPageMethodsを呼び出すことを通知します。

次に、サーバー側の機能を作成します。ここで
は、私が作成した関数で、この関数は、ユーザーの入力を検証します。

[WebMethod] 
public static string RegisterUser(string email, string password) 
{ 
    string result = "Congratulations!!! your account has been created."; 
    if (email.Length == 0)//Zero length check 
    { 
     result = "Email Address cannot be blank"; 
    } 
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks 
    { 
     result = "Not a valid email address"; 
    } 
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks 
    { 
     result = "Not a valid email address"; 
    } 

    else if (password.Length == 0) 
    { 
     result = "Password cannot be blank"; 
    } 
    else if (password.Length < 5) 
    { 
     result = "Password cannot be less than 5 chars"; 
    } 

    return result; 
} 

この方法は、我々は二つのことを確認する必要がありますジャバスクリプトを通じてアクセス可能であることをスクリプトマネージャを伝えるために:
最初に:このメソッドは、「パブリック静的でなければなりません'
2番目:上記のコードで記述されているように、メソッドの上に[WebMethod]タグがあるはずです。

今、アカウントを作成するサーバー側の機能を作成しました。今はクライアント側から呼び出さなければなりません。ここでは、クライアント側からその関数を呼び出すことができる方法です。

<script type="text/javascript"> 
    function Signup() { 
     var email = document.getElementById('<%=txtEmail.ClientID %>').value; 
     var password = document.getElementById('<%=txtPassword.ClientID %>').value; 

     PageMethods.RegisterUser(email, password, onSucess, onError); 

     function onSucess(result) { 
      alert(result); 
     } 

     function onError(result) { 
      alert('Cannot process your request at the moment, please try later.'); 
     } 
    } 
</script> 

私のサーバー側のメソッドの登録ユーザーを呼び出すには、のScriptManagerはPageMethodsで提供されたプロキシ機能を生成します。
私のサーバ側の機能には2つのパラメータ、すなわち電子メールとパスワードがあります。そのパラメータの後に、メソッドが正常に実行された場合に実行される2つ以上の関数名を渡す必要があります。

今、すべての準備が整っているようですが、今すぐサインアップボタンにOnClientClick="Signup();return false;"を追加しました。だからここに私のaspxページの完全なコード:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> 
     </asp:ScriptManager> 
     <fieldset style="width: 200px;"> 
      <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label> 
      <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox> 
      <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label> 
      <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox> 
     </fieldset> 
     <div> 
     </div> 
     <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="Signup();return false;" /> 
    </div> 
    </form> 
</body> 
</html> 

<script type="text/javascript"> 
    function Signup() { 
     var email = document.getElementById('<%=txtEmail.ClientID %>').value; 
     var password = document.getElementById('<%=txtPassword.ClientID %>').value; 

     PageMethods.RegisterUser(email, password, onSucess, onError); 

     function onSucess(result) { 
      alert(result); 
     } 

     function onError(result) { 
      alert('Cannot process your request at the moment, please try later.'); 
     } 
    } 
</script> 
+3

+1これはチュートリアルです:D –

+3

+1、あなたは私のヒーロー= D – ch2o

+0

ありがとう@Fahad、私はエラーが表示されます: 'Microsoft JScriptランタイムエラー: 'PageMethods'は未定義です。私の問題は、これをマスターページに実装しているようです。 –

4

あなたは、私が疑われるAjax呼び出しを行う必要があります:私はこれが私のコードで私のプログラミングlanaguageとして

をVisual Studioの2010とC#を使用しています。ここでは、jQueryによって作成されたAjaxの例を紹介します。コードはユーザーに自分のシステムにログインしますが、成功したかどうかについてはboolを返します。コードビハインドメソッドのScriptMethodおよびWebMethod属性に注意してください。マークアップで

:背後にあるコードで

var $Username = $("#txtUsername").val(); 
      var $Password = $("#txtPassword").val(); 

      //Call the approve method on the code behind 
      $.ajax({ 
       type: "POST", 
       url: "Pages/Mobile/Login.aspx/LoginUser", 
       data: "{'Username':'" + $Username + "', 'Password':'" + $Password + "' }", //Pass the parameter names and values 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       async: true, 
       error: function (jqXHR, textStatus, errorThrown) { 
        alert("Error- Status: " + textStatus + " jqXHR Status: " + jqXHR.status + " jqXHR Response Text:" + jqXHR.responseText) }, 
       success: function (msg) { 
        if (msg.d == true) { 
         window.location.href = "Pages/Mobile/Basic/Index.aspx"; 
        } 
        else { 
         //show error 
         alert('login failed'); 
        } 
       } 
      }); 

/// <summary> 
/// Logs in the user 
/// </summary> 
/// <param name="Username">The username</param> 
/// <param name="Password">The password</param> 
/// <returns>true if login successful</returns> 
[WebMethod, ScriptMethod] 
public static bool LoginUser(string Username, string Password) 
{ 
    try 
    { 
     StaticStore.CurrentUser = new User(Username, Password); 

     //check the login details were correct 
     if (StaticStore.CurrentUser.IsAuthentiacted) 
     { 
      //change the status to logged in 
      StaticStore.CurrentUser.LoginStatus = Objects.Enums.LoginStatus.LoggedIn; 

      //Store the user ID in the list of active users 
      (HttpContext.Current.Application[ SessionKeys.ActiveUsers ] as Dictionary<string, int>)[ HttpContext.Current.Session.SessionID ] = StaticStore.CurrentUser.UserID; 

      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (Exception ex) 
    { 
     return false; 
    } 
} 
0

いくつかのオプションがあります。目的のためにWebMethod属性を使用できます。私は右先に行くと、あなたがまだの場合は、ライブラリをインポートする必要があります意味のjQueryを使用してソリューションを、提供するつもりだ

3

...あなたのページのMARK-で

インポートjQueryライブラリアップ:

<script type="text/javascript" src="/ExecutePageMethod.js" ></script> 

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

次に*スクリプトファイルを.jsファイル(つまり、公開しようとしている唯一の方法であるので、私は、ExecutePageMethod鉱山を呼び出す)と、それをインポートする別のものを作成します

function ExecutePageMethod(page, fn, paramArray, successFn, errorFn) { 
    var paramList = ''; 
    if (paramArray.length > 0) { 
     for (var i = 0; i < paramArray.length; i += 2) { 
      if (paramList.length > 0) paramList += ','; 
      paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"'; 
     } 
    } 
    paramList = '{' + paramList + '}'; 
    $.ajax({ 
     type: "POST", 
     url: page + "/" + fn, 
     contentType: "application/json; charset=utf-8", 
     data: paramList, 
     dataType: "json", 
     success: successFn, 
     error: errorFn 
    }); 
} 

あなたはその後、適切な属性を使用して、.NETページの方法を強化する必要があります。新しく追加されたファイルの中で、次のコード(私は別の場所からこれを引いて覚えているので、他の誰かが本当にそれのための信用に値する)を追加、のような:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static string MyMethod() 
{ 
    return "Yay!"; 
} 

今、あなたのページのマークアップ内、scriptブロック内または別のスクリプトファイルから、あなたがメソッドを呼び出すことができ、そのような:

ExecutePageMethod("PageName.aspx", "MyMethod", [], OnSuccess, OnFailure); 

明らかに、OnSuccessOnFailureメソッドを実装する必要があります。

OnSuccessメソッドでは、結果がより複雑になる場合(たとえば、型の配列を返すなど)、parseJSONメソッドを使用できます。このメソッドは、解析しますオブジェクト:

function OnSuccess(result) { 
    var parsedResult = jQuery.parseJSON(result.d); 
} 

このExecutePageMethodコードは、それが再利用可能な、そうではなく、あなたが実行したい場合があり、各ページメソッドの$.ajaxコールを管理すること、それ以来、特に便利ですが、あなただけのページ、メソッド名を渡す必要があり、このメソッドの引数

+0

このメソッドを使用するには、ページにScriptManagerツールが必要ですか?私は上の選択された答えを使用するときに私のスクリプトの読み込みすべてに問題があるようです。 –

1

Jayrock RPC libraryは、C#の開発者のための素晴らしいfamilliarな方法でこれを行うための素晴らしいツールです。これにより、必要なメソッドで.NETクラスを作成し、このクラスをスクリプトとして(ラウンドアバウトで)ページに追加することができます。型のjsオブジェクトを作成し、他のオブジェクトと同じようにメソッドを呼び出すことができます。

これは本質的にajaxの実装を隠し、RPCをFamilliar形式で表します。 ASP.NET MVCを使用してjQuery ajaxを使用してアクションメソッドを呼び出すことをお勧めします - はるかに簡潔で使いこなせる!

関連する問題