Ist es möglich, eine WebMethod in einer Datei ascx.cs (für ein UserControl) zu platzieren und sie dann vom clientseitigen jQuery-Code aus aufzurufen?
Aus einigen Gründen kann ich den WebMethod-Code nicht in eine .asmx- oder .aspx-Datei einfügen.
Beispiel: In ArticleList.ascx.cs habe ich den folgenden Code:
[WebMethod]
public static string HelloWorld()
{
return "helloWorld";
}
In der ArticleList.ascx-Datei habe ich den Aufruf der WebMethod wie folgt:
$.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);
}
});
und der Fehler von Firebug ist:
<html>
<head>
<title>This type of page is not served.</title>
Wie kann ich die serverseitige WebMethod aus meinem clientseitigen jQuery-Code erfolgreich aufrufen?
WebMethod sollte statisch sein. Sie können es also in das Benutzersteuerelement einfügen und auf der Seite eine Methode hinzufügen, um es aufzurufen.
Bearbeiten:
Sie können keine Webmethode über ein Benutzersteuerelement aufrufen, da diese automatisch auf der Seite gerendert wird.
Die Webmethode, die Sie in der Benutzersteuerung haben:
public static string HelloWorld()
{
return "helloWOrld";
}
Fügen Sie in der Page-Klasse die Webmethode hinzu:
[WebMethod]
public static string HelloWorld()
{
return ArticleList.HelloWorld(); // call the method which
// exists in the user control
}
Ihre Methode muss in einer ASPX-Datei sein (oder ich denke, dass .ashx oder .asmx auch funktionieren werden). Da es tatsächlich einen neuen Aufruf an den Webserver tätigt, muss IIS die Anforderung verarbeiten, und IIS reagiert nicht auf Aufrufe von .ascx-Dateien.
Sie können eine Methode nicht direkt in einem Benutzersteuerelement mit Jquery Ajax aufrufen.
Sie können jedoch einen der folgenden Ansätze ausprobieren:
Legen Sie die URL auf PageName.aspx?Method=YourMethod
fest oder fügen Sie möglicherweise einige __. Andere Einschränkungen hinzu, damit Sie wissen, welches Benutzersteuerelement die __.-Methode ausführen soll. In Ihrem Benutzersteuerelement können Sie dann überprüfen, ob Ihre Einschränkungen in der Querzeichenfolge vorhanden sind, und die angegebene Methode ausführen.
Sie können einfach mit dem Client-Rückruf eine Methode ausführen, wenn Sie etwas async tun müssen. In GetCallbackResult auf der Seite können Sie das Steuerelement finden, das den Rückruf verursacht hat, und die Anforderung .__ mit ihren Argumenten an das Steuerelement übergeben.
Ich bin auf dieses Problem gestoßen und habe eine Kombination von Dekker, Homan und Gruber Lösungen verwendet. Alles Guthaben geht an sie.
Ich musste die Sitzung ändern können, wenn ein Benutzer auf ein Kontrollkästchen klickte. Da die Seitenmethode statisch sein muss, ist ihre Funktionsweise begrenzt und ich kann die Sitzung nicht ändern. Also habe ich mit jQuery eine statische Methode in der übergeordneten Seite des Benutzersteuerelements aufgerufen, das eine Webdienstmethode aufgerufen hat, die die von mir benötigte Arbeit erledigt.
Javascript .ascx-Datei des Benutzersteuerelements
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);
}
});
}
Übergeordneter Seitencode hinter der .aspx.cs-Datei
[WebMethod]
public static void StaticPageMethod(string pVal)
{
var webService = new GridViewService();
webService.GridCheckChanged(pVal);
}
Webdienst .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
}
}
Sie können dies in Ihrer Webmethode tun
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)
Sie können nicht über die Benutzersteuerung auf WebMethod zugreifen, Sie können jedoch Ihre Funktionalität ausführen.
Kontrollieren Sie die Registrierung bei 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"%>
Verwendung in Aspx steuern:
<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 Aufruf:
$.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 hinter der Methode:
[System.Web.Services.WebMethod]
public static string GetPeoplePickerData()
{
try
{
return PeoplePicker.GetPeoplePickerData();
}
catch (Exception ex)
{
throw ex;
}
}
Code hinter der Kontrolle:
[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;
}
}