是否可以将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);
}
});
来自萤火虫的错误是:
<html>
<head>
<title>This type of page is not served.</title>
如何从客户端jQuery代码中成功调用服务器端WebMethod?
答案 0 :(得分:31)
WebMethod应该是静态的。因此,您可以将其放在用户控件中,并在页面中添加一个方法来调用它。
修改强>
您无法通过用户控件调用Web方法,因为它将自动在页面内呈现。
您在用户控件中使用的Web方法:
public static string HelloWorld()
{
return "helloWOrld";
}
在Page类中添加web方法:
[WebMethod]
public static string HelloWorld()
{
return ArticleList.HelloWorld(); // call the method which
// exists in the user control
}
答案 1 :(得分:11)
您的方法需要在.aspx中(或者我认为.ashx或.asmx也可以)。由于它实际上正在对Web服务器进行新的调用,因此IIS必须处理该请求,并且IIS不会响应对.ascx文件的调用。
答案 2 :(得分:8)
您无法使用Jquery Ajax直接在用户控件中调用方法。
您可以尝试以下方法之一:
将网址设置为PageName.aspx?Method=YourMethod
或者添加一些
其他限制因此您知道应该执行哪个用户控件
方法。然后在您的用户控件中,您可以检查是否存在
您在查询字符串中的限制,并执行给定的方法。
如果你这样做,你可以使用客户端回调来执行某些方法 需要做一些异步的事情。在页面的GetCallbackResult中,你 可以找到导致回调的控件,并传递请求 其控制参数。
答案 3 :(得分:2)
我遇到了这个问题,并结合使用了Dekker,Homan和Gruber的解决方案。所有的功劳归功于他们。
我需要能够在用户单击复选框时修改会话。由于页面方法必须是静态的,因此它在你可以做的内容中受到限制,我无法修改Session。所以我使用jQuery在用户控件的父页面中调用一个静态方法,该方法调用了一个Web服务方法来完成我需要的工作。
用户控件的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
}
}
答案 4 :(得分:1)
你可以在你的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)
答案 5 :(得分:0)
在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 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;
}
}
答案 6 :(得分:0)
您无法从用户控制访问WebMethod,但您可以执行自己的功能。
答案 7 :(得分:0)
clyde 不,因为 ascx 控件不代表可以从客户端计算机访问的真实 URL。它们纯粹是服务器端,旨在嵌入其他页面。
您可能想要做的只是有一个 asx 页面,该页面提供与您当前在 ascx 文件中相同的 html 片段。 aspx 页面不一定需要提供完整的 html 文档(等),它可以只呈现您感兴趣的用户控件。
我们一直在 ingrid 插件中使用这种技术,它需要表格内容的回调 url。
答案 8 :(得分:-1)
它对我有用,只需放一个asp:按钮并编写它的事件OnClick,如果你需要返回一个结果,你必须使该事件在asp:Label或HiddenField中设置你的结果,例如:
背后的代码
FilterAction
用户控件
protected void btnSave_OnClick(object sender, EventArgs e) {
lblresult.Text = "Hello world!";
}
Javascript:从客户端jQuery代码调用
<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>