web-dev-qa-db-de.com

Wie Aufrufen einer ASP.NET-WebMethod in einem UserControl (.ascx)

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?

38
gruber

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
}
31
Homam

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.

11
Joe Enos

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.

8
Erik Dekker

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
    }
}
2
Josh Allen

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)
1
user2061951

Sie können nicht über die Benutzersteuerung auf WebMethod zugreifen, Sie können jedoch Ihre Funktionalität ausführen.

  1. Erstellen Sie eine einfache Webseite (aspx).
  2. Webmethode in die Webseite schreiben (aspx.cs).
  3. Zugriffsmethode von der Webseite.
0
Rohit Dodiya

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;
    }
}
0
Jaydeep Shil