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

Lesezeit: 6 Minuten

Benutzer-Avatar
Gruber

Ist es möglich, eine WebMethod in einer ascx.cs-Datei (für ein UserControl) zu platzieren und sie dann über den clientseitigen jQuery-Code aufzurufen?

Aus bestimmten Gründen kann ich den WebMethod-Code nicht in eine .asmx- oder .aspx-Datei einfügen.

Beispiel: In ArticleList.ascx.cs habe ich folgenden Code:

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

In der Datei ArticleList.ascx 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 erfolgreich aus meinem clientseitigen jQuery-Code aufrufen?

  • Können wir einen Code sehen? Das Webbenutzersteuerelement verhält sich ähnlich wie eine Masterseite. Sobald die Seite für den Browser gerendert ist, funktioniert alles so, als wäre es zunächst eine Seite.

    – Der Muffinmann

    12. April 2011 um 16:00 Uhr

  • Ah, ich sehe, was du tust. Wenn ich Ajax in asp.net verwende, erstelle ich eine Webservice-Datei. Es hat die Erweiterung .asmx. Wenn Sie das verwenden, ist es ein großartiger Ort, um alle Ihre Ajax-Methoden zu speichern.

    – Der Muffinmann

    12. April 2011 um 16:32 Uhr

  • Aus irgendwelchen Gründen kann ich diesen Code nicht in eine ASMX- oder ASPX-Datei einfügen.

    – Gruber

    12. April 2011 um 19:49 Uhr

  • Diese Frage scheint verwandt, aber nicht ganz identisch.

    – Tim Post

    9. Januar 2012 um 8:55 Uhr

Benutzer-Avatar
Homm

WebMethod sollte statisch sein. Sie können es also in das Benutzersteuerelement einfügen und eine Methode auf der Seite hinzufügen, um es aufzurufen.

Bearbeiten:

Sie können eine Webmethode nicht über ein Benutzersteuerelement aufrufen, da sie automatisch innerhalb 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
}

  • Aus irgendwelchen Gründen kann ich diesen Code nicht in eine ASMX- oder ASPX-Datei einfügen.

    – Gruber

    12. April 2011 um 19:50 Uhr

Benutzer-Avatar
Joe Enos

Ihre Methode muss sich in einer .aspx-Datei befinden (oder ich denke, .ashx oder .asmx funktionieren auch). Da tatsächlich ein neuer Aufruf an den Webserver erfolgt, muss IIS die Anforderung verarbeiten, und IIS antwortet nicht auf Aufrufe von .ascx-Dateien.

Benutzer-Avatar
Erik Dekker

Sie können eine Methode nicht direkt in einem Benutzersteuerelement mit Jquery Ajax aufrufen.

Sie können jedoch einen der folgenden Ansätze ausprobieren:

  • Stellen Sie die URL auf ein PageName.aspx?Method=YourMethod oder fügen Sie vielleicht einige andere Einschränkungen hinzu, damit Sie wissen, welches Benutzersteuerelement die Methode ausführen soll. Dann können Sie in Ihrer Benutzersteuerung prüfen, ob Ihre Einschränkungen in der Abfragezeichenfolge vorhanden sind, und die angegebene Methode ausführen.

  • Sie können einfach den Client-Callback verwenden, um eine Methode auszuführen, wenn Sie etwas Asynchrones 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.

  • Warum die Ablehnung? Beide Punkte funktionieren gut. Wenn Sie ablehnen, dann erklären Sie bitte auch warum.

    – Erik Dekker

    7. April 2014 um 7:00 Uhr

Ich bin auf dieses Problem gestoßen und habe eine Kombination aus Lösungen von Dekker, Homan und Gruber verwendet. Aller Kredit geht an sie.

Ich musste in der Lage sein, die Sitzung zu ändern, wenn ein Benutzer auf ein Kontrollkästchen klickte. Da die Seitenmethode statisch sein muss, ist sie in ihren Möglichkeiten eingeschränkt, und ich konnte die Sitzung nicht ändern. Also habe ich jQuery verwendet, um eine statische Methode auf der übergeordneten Seite des Benutzersteuerelements aufzurufen, die eine Webdienstmethode aufgerufen hat, die die von mir benötigte Arbeit erledigt hat.

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

Das kannst du in deiner Webmethod so machen

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)

  • Beachten Sie, dass OP C# und nicht VB verwendet.

    – Morten Kristensen

    13. September 2013 um 16:31 Uhr

  • Obwohl der Code in VB ist, ist er einfach und nützlich und kann ohne Komplikationen in C# verwendet werden

    – Pankaj Dubey

    15. September 2014 um 5:59 Uhr

Benutzer-Avatar
Rohit Dodiya

Sie können nicht über die Benutzersteuerung auf WebMethod zugreifen, aber Sie können Ihre Funktionen ausführen.

  1. Erstellen Sie eine einfache Webseite (aspx).
  2. Schreiben Sie webmethod in die Webseite (aspx.cs).
  3. Zugriffsmethode von der Webseite.

  • Beachten Sie, dass OP C# und nicht VB verwendet.

    – Morten Kristensen

    13. September 2013 um 16:31 Uhr

  • Obwohl der Code in VB ist, ist er einfach und nützlich und kann ohne Komplikationen in C# verwendet werden

    – Pankaj Dubey

    15. September 2014 um 5:59 Uhr

Benutzer-Avatar
Mikael Dui Bolinder

Steuern 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="https://stackoverflow.com/questions/5638184/~/Pages/PeoplePicker.ascx" TagName="PeoplePicker"%>

Steuern Sie die Verwendung in 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-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;
    }
}

1245250cookie-checkAufrufen einer ASP.NET WebMethod in einem UserControl (.ascx)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy