2009-09-01 16 views
15

¿Cómo puedo llamar a un método no estático en el lado del servidor (aspx.cs) desde el lado del cliente usando javascript (aspx) ....?Método no estático en el lado del servidor desde el lado del cliente usando JavsScript

Por lo que yo sé que puedo llamar al método estático en el lado del servidor del lado del cliente ... lado

servidor:

[WebMethod] 
public static void method1() 
{ 
} 

lado del cliente:

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

Funciona. Ahora, ¿cómo puedo llamar al método no estático desde el lado del cliente?

Respuesta

7

No, no puede llamar a métodos no estáticos del lado del cliente per se. Lo intenté una vez pero es feo (también usé jQuery ajax). Simplemente llame a la página usando ajax con el nombre del método adjunto como parámetro de cadena de consulta y luego en el lado del servidor, verifique el parámetro y llame al método correspondiente. Pero, como ya te he dicho que es bastante feo :(

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

en el lado del servidor:.

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; 
     ..... 
     ..... 
    } 
} 
+0

OK lo tengo muchachos ... así que ....................... ¿usted tiene otra solución cómo llamar al método en el servidor (aspx.cs) desde el lado del cliente (aspx) chicos ..... gracias 4 solución ...... – Pramulia

+0

@theVillageldiot ¿estás seguro de que es feo? o no hay cualquier otra cosa que no deberíamos usar de esta manera? porque creo que esta forma de llamar es mejor que usar [método web]. Gracias de cualquier manera. – vesna

1

En realidad, no llegan a llamar a los métodos no estáticos de esta manera

Cuando se llama a una PageMethod, que está básicamente llamar a un servicio web especial. Esta característica sólo funciona con métodos estáticos en la misma página.

+0

OK lo tengo muchachos ... así que ....................... tiene otra solución cómo llamar al método en el servidor (aspx.cs) desde el lado del cliente (aspx) chicos ..... gracias 4 solución ...... – Pramulia

-4

Dave tenemos detalles sobre la llamada métodos de página ing desde el lado del cliente utilizando jquery ajax. La idea general es la siguiente (si encuentra algún problema, consulte el sitio de Dave).

C# Código:

[WebMethod] 
public static string yourmethod(/*params*/) 
{ 
    return "Hello World!" 
} 

ASPX:

$.ajax({ 
    type: 'POST', 
    data: /*Your Data*/, 
    dataType: 'JSON', 
    contentType: 'application/json', 
    url: '/yourpage.aspx/yourmethod',//Method to call 
    success: function(result, status) { 
     //handle return data 
    }, 
    error: function(xhr, status, error) { 
     //handle error 
    } 
}); 
+0

Ok ... gracias U ... – Pramulia

+4

no hizo la pregunta original acerca de los métodos NO estáticos ? –

+0

@Gordon no sé por qué respondí esta pregunta dos veces. – TheVillageIdiot

0

como una respuesta a Pramulia pienso que usted quiere tener una función con un argumento desde el lado del cliente que se implementa en el ejemplo -> 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

¿Has probado eso? –

+0

copié esto de algún sitio web de Microsoft. funciona bien y obtiene una cadena del lado del servidor al lado del cliente, sin embargo, necesito una solución que active el método no estático en el servidor desde un javascript. – Kubi

16

puede evitar el restricción estática t usando una página .asmx simple en lugar de la página codebehind.

1) Abrir nuevo sitio web utilizando la plantilla AJAX Habilitar ASP.NET (que pone las referencias necesarias en el web.config)

2) SIMPLESERVICE.ASMX - Añadir un nuevo servicio web .asmx (I llama la mina SimpleService.asmx) Observe la decoración [System.Web.Script.Services.ScriptSerive] y que la clase SimpleService implementa el servicio 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 - Para usarlo de referencia del servicio en el Gestor de guión y que están fuera de funcionamiento. En mi Javascript llamo 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> 

he usado el ejemplo que encontré de Scott Gu Found Here.

+0

He intentado esto y no funciona ... ¿Hay alguna herramienta externa que deba descargar? –

+0

Estoy buscando hacer algo como lo anterior, pero no estoy seguro de qué tipo de parámetros tengo permiso para pasar a mi función de servicio web desde el lado de JavaScript. En última instancia, me gustaría pasar el objeto Página, pero obtengo todo tipo de errores cuando intento hacerlo. ¿Puedo pasar objetos .NET, como cosas en el espacio de nombres System.Web.UI.WebControls? – LeeCambl

+2

Tenga en cuenta que ya no debe usar ASMX, es una tecnología heredada, apenas compatible. Lo mismo se puede hacer con WCF. –

1

C#

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

JS/jQuery

$('#txt').val(<%= LoadString() %>); 
+0

puede usar protegido en lugar de público. – Mike

-1

Si desea llamar usando la misma función , puede usar el siguiente código:

[WebMethod] 
public static void method1() 
{ 
    ClassOfNonStaticFunction obj = new ClassOfNonStaticFunction(); 
    obj.yourFunctionName(ParametersIfAny); 
} 
Cuestiones relacionadas