Как вызвать ASP.NET WebMethod в UserControl (.ascx)

Можно ли поместить WebMethod в файл ascx.cs (для UserControl), а затем вызвать его из клиентского кода jQuery?

По некоторым причинам я не могу поместить код WebMethod в файл .asmx или .aspx.

Пример: В ArticleList.ascx.cs у меня есть следующий код:

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

В файле ArticleList.ascx у меня есть вызов WebMethod следующим образом:

$.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);
            }
        });

и ошибка от firebug:

<html>
<head>
    <title>This type of page is not served.</title>

Как я могу успешно вызвать WebMethod на стороне сервера из кода jQuery на стороне клиента?


person gruber    schedule 12.04.2011    source источник
comment
Можем ли мы увидеть код? Пользовательский веб-элемент управления действует аналогично главной странице. Как только страница отображается в браузере, все работает так, как если бы это была одна страница.   -  person The Muffin Man    schedule 12.04.2011
comment
А, я вижу, что ты делаешь. Когда я использую Ajax в asp.net, я создаю файл веб-сервиса. Он имеет расширение .asmx. Если вы используете это, это отличное место для хранения всех ваших методов ajax.   -  person The Muffin Man    schedule 12.04.2011
comment
По некоторым причинам я не могу поместить этот код в файл asmx или aspx.   -  person gruber    schedule 12.04.2011
comment
Этот вопрос кажется связанным, но не совсем идентичный.   -  person Tim Post♦    schedule 09.01.2012


Ответы (8)


WebMethod должен быть статическим. Итак, вы можете поместить его в пользовательский элемент управления и добавить на страницу метод для его вызова.

Изменить:

Вы не можете вызвать веб-метод через пользовательский элемент управления, потому что он будет автоматически отображаться внутри страницы.

Веб-метод, который у вас есть в пользовательском элементе управления:

public static string HelloWorld()
{
    return "helloWOrld";
}

В классе Page добавьте веб-метод:

[WebMethod]
public static string HelloWorld()
{
    return ArticleList.HelloWorld(); // call the method which 
                                     // exists in the user control
}
person Homam    schedule 12.04.2011
comment
По некоторым причинам я не могу поместить этот код в файл asmx или aspx. - person gruber; 12.04.2011

Ваш метод должен быть в формате .aspx (или я думаю, что .ashx или .asmx также будут работать). Поскольку на самом деле выполняется новый вызов веб-сервера, IIS должен обработать запрос, а IIS не будет отвечать на вызовы файлов .ascx.

person Joe Enos    schedule 12.04.2011

Вы не можете вызвать метод непосредственно в пользовательском элементе управления с помощью Jquery Ajax.

Однако вы можете попробовать один из следующих подходов:

  • Установите URL-адрес на PageName.aspx?Method=YourMethod или, возможно, добавьте некоторые другие ограничения, чтобы вы знали, какой пользовательский элемент управления должен выполнять метод. Затем в своем пользовательском элементе управления вы можете проверить наличие ваших ограничений в строке запроса и выполнить данный метод.

  • Вы можете просто использовать обратный вызов клиента для выполнения какого-либо метода, если вам нужно сделать что-то асинхронное. в GetCallbackResult на странице можно найти элемент управления, вызвавший обратный вызов, и передать запрос с его аргументами элементу управления.

person Erik Dekker    schedule 10.01.2012
comment
Почему минус? Обе точки работают хорошо. Если будете минусовать, то объясните почему, пожалуйста.. - person Erik Dekker; 07.04.2014

Я столкнулся с этой проблемой и использовал комбинацию решений Dekker, Homan и Gruber. Вся заслуга принадлежит им.

Мне нужно было иметь возможность изменять сеанс, когда пользователь устанавливал флажок. Поскольку метод страницы должен быть статическим, он ограничен тем, что вы можете делать внутри него, и я не мог изменить Session. Поэтому я использовал jQuery для вызова статического метода на родительской странице пользовательского элемента управления, который вызывал метод веб-службы, который выполнял нужную мне работу.

Файл Javascript .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);
        }
    });
}

Код родительской страницы в файле .aspx.cs

[WebMethod]
    public static void StaticPageMethod(string pVal)
    {
        var webService = new GridViewService();
        webService.GridCheckChanged(pVal);
    }

Веб-служба .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
    }
}
person Josh Allen    schedule 04.02.2013

Вы можете сделать это так в своем веб-методе

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)
person user2061951    schedule 13.09.2013
comment
Обратите внимание, что OP использует C#, а не VB. - person Morten Kristensen; 13.09.2013
comment
Хотя код на VB, но он простой и полезный, и его можно использовать на C# без каких-либо осложнений. - person Pankaj Dubey; 15.09.2014

Вы не можете получить доступ к WebMethod из пользовательского контроля, но вы можете выполнять свои функции.

  1. Создайте одну простую веб-страницу (aspx).
  2. Напишите веб-метод на веб-странице (aspx.cs).
  3. Метод доступа с веб-страницы.
person Rohit Dodiya    schedule 16.06.2017

Контрольная регистрация на 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"%>

Управление использованием в 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-вызов:

$.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);
    }

});

Код позади метода:

[System.Web.Services.WebMethod]
public static string GetPeoplePickerData()
{
    try
    {
        return PeoplePicker.GetPeoplePickerData();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

Код позади Control :

[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;
    }
}
person Jaydeep Shil    schedule 08.10.2015

clyde Нет, поскольку элементы управления ascx не представляют реальный URL-адрес, к которому можно получить доступ с клиентского компьютера. Они предназначены исключительно для сервера и предназначены для встраивания в другие страницы.

Что вы можете сделать, так это просто иметь страницу aspx, которая предоставляет тот же фрагмент html, который у вас есть в вашем файле ascx. Страница aspx не обязательно должна предоставлять полный HTML-документ (и т. д.), она может просто отображать интересующий вас пользовательский элемент управления.

Мы постоянно используем эту технику с плагином ingrid, который требует URL обратного вызова для содержимого таблицы.

person M Safari    schedule 20.04.2021