Est-il possible de placer un WebMethod dans un fichier ascx.cs (pour un UserControl) puis de l'appeler à partir d'un code jQuery côté client?
Pour certaines raisons, je ne peux pas placer le code WebMethod dans un fichier .asmx ou .aspx.
Exemple: Dans ArticleList.ascx.cs, j'ai le code suivant:
[WebMethod]
public static string HelloWorld()
{
return "helloWorld";
}
Dans le fichier ArticleList.ascx, j'ai l'appel du 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 appeler avec succès WebMethod côté serveur à partir de mon code jQuery côté client?
WebMethod devrait être statique. Donc, vous pouvez le mettre dans le contrôle utilisateur et ajouter une méthode dans la page pour l'appeler.
Modifier:
Vous ne pouvez pas appeler une méthode Web via un contrôle utilisateur, car celle-ci sera automatiquement restituée dans la page.
La méthode Web que vous avez dans le contrôle utilisateur:
public static string HelloWorld()
{
return "helloWOrld";
}
Dans la classe Page, ajoutez 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 un fichier .aspx (ou je pense que .ashx ou .asmx fonctionneront également). Puisqu'il s'agit en réalité d'un nouvel appel sur le serveur Web, IIS doit gérer la demande et IIS ne répondra pas aux appels de fichiers .ascx.
Vous ne pouvez pas appeler une méthode directement dans un contrôle utilisateur à l'aide de Jquery Ajax.
Vous pouvez cependant essayer l'une des approches suivantes:
Définissez l'URL sur PageName.aspx?Method=YourMethod
ou ajoutez éventuellement d'autres restrictions pour vous permettre de savoir quel contrôle utilisateur doit exécuter la méthode Ensuite, dans votre contrôle utilisateur, vous pouvez vérifier l’existence de Vos restrictions dans la chaîne de requête et exécuter la méthode donnée.
Vous pouvez simplement utiliser le rappel client pour exécuter une méthode, si vous devez effectuer une opération asynchrone. Dans le GetCallbackResult de la page, vous pouvez trouver le contrôle qui a provoqué le rappel et transmettre la demande .__ avec ses arguments au contrôle.
Je suis tombé sur ce problème et ai utilisé une combinaison des solutions de Dekker, Homan et Gruber. Tout le mérite leur revient.
J'avais besoin de pouvoir modifier la session lorsqu'un utilisateur a coché une case à cocher. Comme la méthode de la page doit être statique, son contenu est limité et je ne peux pas modifier la session. J'ai donc utilisé jQuery pour appeler une méthode statique dans la page parent du contrôle utilisateur qui appelait une méthode de service Web ayant effectué le travail dont j'avais besoin.
Fichier .ascx Javascript du contrôle utilisateur
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 page parent derrière le fichier .aspx.cs
[WebMethod]
public static void StaticPageMethod(string pVal)
{
var webService = new GridViewService();
webService.GridCheckChanged(pVal);
}
Web service .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 méthode Web
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 exécuter vos fonctionnalités.
Enregistrement de contrôle chez 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 de l'utilisation dans 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 appelez:
$.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);
}
});
Méthode de code derrière:
[System.Web.Services.WebMethod]
public static string GetPeoplePickerData()
{
try
{
return PeoplePicker.GetPeoplePickerData();
}
catch (Exception ex)
{
throw ex;
}
}
Code derrière le 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;
}
}