Comment appeler un ASP.NET WebMethod dans un UserControl (.ascx)
est-il possible de placer une Webméthode dans un ascx.fichier cs (pour un UserControl) et ensuite l'appeler à partir du code jQuery côté client?
pour certaines raisons je ne peux pas placer le code WebMethod dans un .asmx ou .fichier aspx.
Exemple: Dans ArticleList.ascx.cs, j'ai le code suivant:
[WebMethod]
public static string HelloWorld()
{
return "helloWorld";
}
Dans L'ArticleList.fichier ascx là, j'ai l'appel à la WebMethod comme suit:
$.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);
}
});
et l'erreur de firebug est:
<html>
<head>
<title>This type of page is not served.</title>
Comment puis-je appeler avec succès la Webméthode côté serveur à partir de mon code jQuery côté client?
8 réponses
WebMethod devrait être statique. Ainsi, Vous pouvez le mettre dans le contrôle de l'utilisateur et ajouter une méthode dans la page de l'appeler.
Edit:
vous ne pouvez pas appeler une méthode web par un contrôle d'utilisateur parce qu'elle sera automatiquement rendue à l'intérieur de la page.
La méthode web que vous avez dans le contrôle de l'utilisateur:
public static string HelloWorld()
{
return "helloWOrld";
}
dans la classe Page ajouter la méthode web:
[WebMethod]
public static string HelloWorld()
{
return ArticleList.HelloWorld(); // call the method which
// exists in the user control
}
Votre méthode doit être dans une .aspx (ou je pense .ashx ou .asmx fonctionnera aussi bien). Comme il fait un nouvel appel au serveur web, IIS doit gérer la requête, et IIS ne répondra pas aux appels .fichiers ascx.
Vous ne pouvez pas appeler une méthode directement dans un contrôle utilisateur en utilisant jQuery Ajax.
Vous pouvez essayer l'une des méthodes suivantes:
définir L'URL à
PageName.aspx?Method=YourMethod
ou peut-être ajouter quelques autres restrictions afin que vous sachiez quel contrôle utilisateur doit exécuter le méthode. Puis dans votre contrôle de l'utilisateur vous pouvez vérifier l'existence de vos restrictions dans le querystring, et exécutez la méthode donnée.Vous pouvez simplement utiliser le client callback pour exécuter une méthode, si vous besoin de faire quelque chose asynchrone. dans le GetCallbackResult dans la page, vous peut trouver le contrôle qui a causé le rappel, et transmettre la requête avec ses arguments au contrôle.
je suis tombé sur ce problème et j'ai utilisé une combinaison de Dekker, Homan, et les solutions de Gruber. Tout le crédit va à eux.
j'avais besoin de pouvoir modifier la Session lorsqu'un utilisateur cliquait sur une case à cocher. Puisque la méthode de la page doit être statique son limité dans ce que vous pouvez faire à l'intérieur et je ne pouvais pas modifier la Session. J'ai donc utilisé jQuery pour appeler une méthode statique dans la page Mère du contrôle de l'utilisateur qui avait appelé une méthode de service web qui a fait le travail dont j'avais besoin.
contrôle de L'utilisateur Javascript .fichier ascx
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);
}
});
}
Code De La Page Parent Derrière .aspx.fichier cs
[WebMethod]
public static void StaticPageMethod(string pVal)
{
var webService = new GridViewService();
webService.GridCheckChanged(pVal);
}
service 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
}
}
Vous pouvez le faire comme ça dans votre 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)
vous ne pouvez pas accéder à WebMethod à partir du contrôle de l'utilisateur, mais vous pouvez effectuer votre fonctionnalité.
- créer une page Web simple(aspx).
- écrire webmethod dans la page Web (aspx.cs).
- méthode D'accès à partir de la page web.
registre de Contrôle à 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"%>
contrôle à l'aide de 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 Call:
$.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);
}
});
Code de la méthode :
[System.Web.Services.WebMethod]
public static string GetPeoplePickerData()
{
try
{
return PeoplePicker.GetPeoplePickerData();
}
catch (Exception ex)
{
throw ex;
}
}
Code derrière de Contrôle :
[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;
}
}
fonctionner pour moi, il suffit de mettre un asp:button et écrire son événement OnClick, si vous avez besoin de retourner un résultat, vous devez faire de cet événement pour définir votre résultat dans une page asp:Label ou HiddenField par exemple:
Code derrière
protected void btnSave_OnClick(object sender, EventArgs e) {
lblresult.Text = "Hello world!";
}
UserControl
<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: Appel de client-côté jQuery
function call_virtual_webmethod()
{
var id= '<%= btnSave.ClientID %>;
$('#'+id).click();
}