我有一个我正在创建的用户控件,它在jQuery中使用了一些AJAX。
我需要在我的控件的代码隐藏中调用一个函数,但我在网上找到的每个例子都是这样的:
$("input").click(function() {
$.ajax({
type: "POST",
url: "Default.aspx/GetResult",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(result) {
//do something
}
});
});
如果我在Default.aspx页面中有方法,这可以正常工作。但是我不想在那里使用该函数,我需要在我的控件的代码隐藏中使用该函数。如何修改url属性以调用正确的函数?
我试过了:
url: "GetResult"
但这没效果。
答案 0 :(得分:7)
处理此问题的方法是在页面中使用webmethod,然后将值直接传递给控件中具有相同签名的控件方法 - 没有其他方法可以执行此操作。
换句话说,所有页面方法都会调用usercontrol方法,因此它非常小。如果你有多个子控件的相同签名,你可以传递一个参数来告诉页面方法调用/使用哪一个。
编辑:每个请求(非常非常简单的例子)。您可以找到将更复杂类型传递给服务器端方法的其他示例。例如,请在此处查看我的答案:Jquery .ajax async postback on C# UserControl
实施例: 页面方法:注意“静态”部分。
[WebMethod]
public static string GetServerTimeString()
{
return MyNamespace.UserControls.Menu.ucHelloWorld();
}
用户控制方法:
public static string ucHelloWorld()
{
return "howdy from myUserControl.cs at: " + DateTime.Now.ToString();
}
客户端ajax通过jquery:
$(document).ready(function()
{
/***************************************/
function testLoadTime(jdata)
{
$("#timeResult").text(jdata);
};
$("#testTimeServerButton").click(function()
{
//alert("beep");
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
dataFilter: function(data)
{
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: "MyPage.aspx/GetServerTimeString",
success: function(msg)
{
testLoadTime(msg);
}
});
});
});
注意:dataFilter:function(data)... ajax的一部分是这样的,它可以在不更改客户端代码的情况下使用2.0和3.5 asp.net ajax。
答案 1 :(得分:5)
你不能...... WebMethods必须在WebServices或Pages中,它们不能在UserControls中。
以不同的方式来看待问题更清楚...... UserControl的URL是什么?由于无法访问它们,因此无法直接获取该方法。您可以尝试另一种方式,也许是您页面中的代理方法?