Как вызвать 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-кода на стороне клиента?
Ответы
Ответ 1
WebMethod должен быть статическим. Итак, вы можете поместить его в пользовательский элемент управления и добавить метод на странице для его вызова.
Edit:
Вы не можете вызвать веб-метод через пользовательский элемент управления, потому что он будет автоматически отображаться внутри страницы.
Веб-метод, который у вас есть в пользовательском элементе управления:
public static string HelloWorld()
{
return "helloWOrld";
}
В классе страницы добавьте веб-метод:
[WebMethod]
public static string HelloWorld()
{
return ArticleList.HelloWorld(); // call the method which
// exists in the user control
}
Ответ 2
Ваш метод должен быть в .aspx(или я думаю, что будут работать .ashx или .asmx). Поскольку он действительно вызывает новый вызов веб-сервера, IIS должен обрабатывать запрос, и IIS не будет отвечать на вызовы в файлы .ascx.
Ответ 3
Вы не можете вызвать метод непосредственно в пользовательском элементе управления с помощью JQuery Ajax.
Вы можете попробовать один из следующих подходов:
-
Задайте URL-адрес PageName.aspx?Method=YourMethod
или, возможно, добавьте
другие ограничения, чтобы вы знали, какой пользовательский элемент управления должен выполнить
метод. Затем в вашем пользовательском контроле вы можете проверить наличие
ваши ограничения в querystring и выполнить данный метод.
-
Вы можете просто использовать обратный вызов клиента для выполнения некоторого метода, если вы
нужно сделать что-то асинхронное. в GetCallbackResult на странице, вы
может найти элемент управления, вызвавший обратный вызов, и передать запрос
с его аргументами в элемент управления.
Ответ 4
Я столкнулся с этой проблемой и использовал комбинацию решений Dekker, Homan и Gruber. Все кредиты идут им.
Мне нужно было изменить сеанс, когда пользователь щелкнул флажок. Поскольку метод страницы должен быть статическим, он ограничен в том, что вы можете сделать внутри него, и я не смог изменить сеанс. Поэтому я использовал 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
}
}
Ответ 5
Вы можете сделать это так, как в своем Webmethod
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)
Ответ 6
управляющий регистр в 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 Call:
$.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;
}
}
Код за элементом управления:
[WebMethod]
public static string GetPeoplePickerData()
{
try
{
//peoplepickerhelper will get the needed values from the querrystring, 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;
}
}
Ответ 7
Вы не можете получить доступ к WebMethod из пользовательского элемента управления, но можете выполнять свои функции.
- Создайте одну простую веб-страницу (aspx).
- Напишите веб-метод на веб-странице (aspx.cs).
- Метод доступа с веб-страницы.
Ответ 8
Он работает для меня, просто поместите кнопку asp: и напишите его событие OnClick, если вам нужно вернуть результат, вы должны сделать это событие, чтобы установить результат в asp: Label или HiddenField, например:
Код за
protected void btnSave_OnClick(object sender, EventArgs e) {
lblresult.Text = "Hello world!";
}
UserControl
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="btnSave" OnClick="btnSave_Click" runat="server" />
<asp:Label ID="lblresult" runat="server"/>
</ContentTemplate>
</asp:UpdatePanel>
Javascript: вызов из кода jQuery на стороне клиента
function call_virtual_webmethod()
{
var id= '<%= btnSave.ClientID %>;
$('#'+id).click();
}