c# jquery asp.net webmethod ascx

c# - Cómo llamar a un ASP.NET WebMethod en un UserControl(.ascx)



jquery (8)

Funciona para mí, simplemente ponga un botón asp: y escriba su evento OnClick, si necesita devolver un resultado debe hacer ese evento para establecer su resultado en un asp: Label o HiddenField por ejemplo:

Código detrás

protected void btnSave_OnClick(object sender, EventArgs e) { lblresult.Text = "Hello world!"; }

Control de usuario

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Button ID="btnSave" OnClick="btnSave_Click" runat="server" /> <asp:Label ID="lblresult" runat="server"/> </ContentTemplate> </asp:UpdatePanel>

Javascript: llamada desde el código jQuery del lado del cliente

function call_virtual_webmethod() { var id= ''<%= btnSave.ClientID %>; $(''#''+id).click(); }

¿Es posible colocar un WebMethod en un archivo ascx.cs (para un UserControl) y luego llamarlo desde el código jQuery del lado del cliente?

Por alguna razón, no puedo ubicar el código de WebMethod en un archivo .asmx o .aspx.

Ejemplo: en ArticleList.ascx.cs tengo el siguiente código:

[WebMethod] public static string HelloWorld() { return "helloWorld"; }

En el archivo ArticleList.ascx, tengo la llamada al WebMethod de la siguiente manera:

$.ajax({ type: "POST", contentType: "application/json; charset=utf-8", data: "{}", dataFilter: function(data)//makes it work with 2.0 or 3.5 .net { var msg; if (typeof (JSON) !== ''undefined'' && typeof (JSON.parse) === ''function'') msg = JSON.parse(data); else msg = eval(''('' + data + '')''); if (msg.hasOwnProperty(''d'')) return msg.d; else return msg; }, url: "ArticleList.ascx/HelloWorld", success: function(msg) { alert(msg); } });

y el error de Firebug es:

<html> <head> <title>This type of page is not served.</title>

¿Cómo puedo llamar con éxito al WebMethod del lado del servidor desde mi código jQuery del lado del cliente?


Me encontré con este problema y usé una combinación de las soluciones de Dekker, Homan y Gruber. Todo el mérito es de ellos.

Necesitaba poder modificar la sesión cuando un usuario hizo clic en una casilla de verificación. Como el método de la página debe ser estático, está limitado en lo que se puede hacer dentro de él y no pude modificar la sesión. Así que utilicé jQuery para llamar a un método estático en la página principal del control de usuario que había llamado a un método de servicio web que hacía el trabajo que necesitaba.

Archivo Javascript .ascx del control del usuario

function chkSelectedChanged(pVal) { //called when user clicks a check box $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", data: ''{ "p1":'' + pVal+'' }'', url: "ParentPage.aspx/StaticPageMethod", success: function (msg) { //alert(''it worked''); }, error: function (msg) { alert(''boom'' + msg); } }); }

Código de página padre detrás del archivo .aspx.cs

[WebMethod] public static void StaticPageMethod(string pVal) { var webService = new GridViewService(); webService.GridCheckChanged(pVal); }

Servicio web .asmx

[WebService(Namespace = "")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class GridViewService : System.Web.Services.WebService { [WebMethod] public void GridCheckChanged(string pVal) { //Do Work } }


No puede acceder a WebMethod desde el control del usuario pero puede realizar su funcionalidad.

  1. Crea una página web simple (aspx).
  2. Escriba webmethod en la página web (aspx.cs).
  3. Método de acceso desde la página web.

No puede llamar a un método directamente en un control de usuario usando Jquery Ajax.

Sin embargo, puedes probar uno de los siguientes enfoques:

  • Establezca el URL en PageName.aspx?Method=YourMethod o agregue algunas otras restricciones para que sepa qué control de usuario debe ejecutar el método. Luego, en su control de usuario puede verificar la existencia de sus restricciones en la cadena de consulta, y ejecutar el método dado.

  • Solo puede usar la devolución de llamada del cliente para ejecutar algún método, si necesita hacer algo asincrónico. en GetCallbackResult en la página, puede encontrar el control que provocó la devolución de llamada y pasar la solicitud con sus argumentos al control.


Puedes hacerlo así en tu Webmethod

Dim uc As UserControl = New UserControl() Dim objSummarycontrol As SummaryControl = uc.LoadControl("~/Controls/Property/SummaryControl.ascx") Dim propertyId As String = SessionManager.getPropertyId() objSummarycontrol.populateTenancyHistory(propertyId)


Registro de control en aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomerRequirements.aspx.cs" EnableViewState="true" Inherits="Bosch.RBNA.CustomerRequirementsServerWeb.Pages.CustomerRequirements" %> <%@ Register TagPrefix="pp" Src="~/Pages/PeoplePicker.ascx" TagName="PeoplePicker"%>

control usando en aspx:

<div class="form-group"> <label for="exampleInputPassword1">Contact to get permisson</label> <pp:PeoplePicker runat="server" ID="peoplePicker" ClientIDMode="Static"></pp:PeoplePicker> </div>

jquery AJAX Llamada:

$.ajax({ type: "POST", url: CustomerRequirements.aspx/GetPeoplePickerData + "?SearchString=" + searchText + "&SPHostUrl=" + parent.GetSpHostUrl() + "&PrincipalType=" + parent.GetPrincipalType() + (spGroupName? "&SPGroupName=" + spGroupName: ""), data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function (msg) { parent.QuerySuccess(queryIDToPass, msg.d); }, error: function (response) { var r = jQuery.parseJSON(response.responseText); alert("Message: " + r.Message); alert("StackTrace: " + r.StackTrace); alert("ExceptionType: " + r.ExceptionType); parent.QueryFailure(queryIDToPass); } });

Código detrás del método:

[System.Web.Services.WebMethod] public static string GetPeoplePickerData() { try { return PeoplePicker.GetPeoplePickerData(); } catch (Exception ex) { throw ex; } }

Código detrás de Control:

[WebMethod] public static string GetPeoplePickerData() { try { //peoplepickerhelper will get the needed values from the querystring, get data from sharepoint, and return a result in Json format Uri hostWeb = new Uri("http://ramsqlbi:9999/sites/app"); var clientContext = TokenHelper.GetS2SClientContextWithWindowsIdentity(hostWeb, HttpContext.Current.Request.LogonUserIdentity); return GetPeoplePickerSearchData(clientContext); } catch (Exception ex) { throw ex; } }


Tu método debe estar en .aspx (o creo que .ashx o .asmx también funcionarán). Como en realidad está realizando una nueva llamada al servidor web, IIS debe gestionar la solicitud e IIS no responderá a las llamadas a los archivos .ascx.


WebMethod debe ser estático. Entonces, puede colocarlo en el control de usuario y agregar un método en la página para llamarlo.

Editar:

No puede llamar a un método web a través de un control de usuario porque se representará automáticamente dentro de la página.

El método web que tienes en el control del usuario:

public static string HelloWorld() { return "helloWOrld"; }

En la clase de página, agregue el método web:

[WebMethod] public static string HelloWorld() { return ArticleList.HelloWorld(); // call the method which // exists in the user control }