![](/img/trans.png)
[英]Call Webmethod in Usercontrol.cs from Usercontrol.ascx javascript
[英]How to call an ASP.NET WebMethod in a 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);
}
});
來自螢火蟲的錯誤是:
<html>
<head>
<title>This type of page is not served.</title>
如何從我的客戶端 jQuery 代碼成功調用服務器端 WebMethod?
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
}
您的方法需要在 .aspx 中(或者我認為 .ashx 或 .asmx 也可以)。 由於它實際上是對 Web 服務器進行新調用,因此 IIS 必須處理請求,並且 IIS 不會響應對 .ascx 文件的調用。
您不能使用 Jquery Ajax 直接在用戶控件中調用方法。
不過,您可以嘗試以下方法之一:
將 URL 設置為PageName.aspx?Method=YourMethod
或者添加一些其他限制,以便您知道哪個用戶控件應該執行該方法。 然后在您的用戶控件中,您可以檢查查詢字符串中是否存在限制,並執行給定的方法。
如果您需要異步執行某些操作,則可以僅使用客戶端回調來執行某些方法。 在頁面的 GetCallbackResult 中,您可以找到引起回調的控件,並將請求及其參數傳遞給控件。
我遇到了這個問題,並結合使用了 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
}
}
你可以在你的 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)
在 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;
}
}
控制背后的代碼:
[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;
}
}
您無法從用戶控件訪問 WebMethod,但您可以執行您的功能。
clyde否,因為 ascx 控件不代表可以從客戶端計算機訪問的真實 URL。 它們純粹是服務器端,旨在嵌入其他頁面。
您可能想要做的只是有一個 asx 頁面,該頁面提供與您當前在 ascx 文件中相同的 html 片段。 aspx 頁面不一定需要提供完整的 html 文檔(等),它可以只呈現您感興趣的用戶控件。
我們一直在 ingrid 插件中使用這種技術,它需要表內容的回調 url。
它適用於我,只需放一個asp:按鈕並編寫其事件OnClick,如果你需要返回一個結果,你必須使該事件在asp:Label或HiddenField中設置你的結果,例如:
代碼背后
protected void btnSave_OnClick(object sender, EventArgs e) {
lblresult.Text = "Hello world!";
}
用戶控件
<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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.