从WebMethod访问代码后台函数

3
我有一个代码后台页面,其中有几个方法;其中之一是页面方法。
[WebMethod]
public static void ResetDate(DateTime TheNewDate)
{
    LoadCallHistory(TheNewDate.Date);
}

protected void LoadCallHistory(DateTime TheDate)
{ bunch of stuff }

当页面加载时,LoadCallHistory方法运行良好,并且我可以从页面内的其他方法调用它。但是,在Web方法部分,它会被红色下划线标记,并显示“需要非静态字段的对象引用”错误。

如何从代码的页面方法部分访问函数?

谢谢。

2个回答

12

在没有类的实例的情况下,无法从静态上下文中调用非静态方法。要么从ResetDate中删除static,要么使LoadCallHistory静态。

但是,如果您从ResetDate中删除static,则必须拥有该方法的实例才能使用它。另一种方法是在ResetDate内创建一个类实例,并使用该实例调用LoadCallHistory,例如:

[WebMethod]
public static void ResetDate(DateTime TheNewDate)
{
    var callHistoryHandler = new Pages_CallHistory();
    callHistoryHandler.LoadCallHistory(TheNewDate.Date);
}

错误信息提示了ResetDate包含关键字static,而LoadCallHistory则没有。当使用static时,要么两个方法都需要是静态的,要么被调用的方法需要是static,如果调用的方法不是静态的,则调用者不能是静态的。
引用MSDN上的"Static Classes and Static Class Members"
一个静态类基本上与非静态类相同,但有一个区别:静态类不能实例化。换句话说,您不能使用new关键字创建该类类型的变量。由于没有实例变量,因此必须使用类名称本身来访问静态类的成员。

换句话说,考虑将您的LoadCallHistory更改为“静态”。 - p.campbell
它正在强调缺少指令的新CallHistoryHandler()部分。 CallHistoryHandler()对象位于哪里? - frenchie
@frenchie,“CallHistoryHandler”只是一个例子。LoadCallHistory()所在的类名是什么?您需要创建该类的新实例才能调用LoadCallHistory() - Filip Ekberg
在您的代码后台文件的顶部,您应该看到类似于 public class xxx 的内容,而不是 xxx,它说了什么? - Filip Ekberg
好的,我明白了。我只需要将代码后面的文件“public partial class Pages_CallHistory : System.Web.UI.Page”中的顶部行复制粘贴到Pages_CallHistory里就可以了。 - frenchie
显示剩余5条评论

1

由于这是一个静态方法,它只能调用其他静态方法或新对象。

如果您的页面类是CallHistory(猜测;)),您需要执行以下操作:

[WebMethod]
public static void ResetDate(DateTime TheNewDate)
{
    var thisPage = new CallHistory();
    thisPage.LoadCallHistory(TheNewDate.Date);
}

或将LoadCallHistory更改为static


我的程序会工作吗?我有一个带有日期选择器的页面,当用户按下日期时,我希望在UpdatePanel中的表格被刷新。目前,我已经让页面方法接收到了正确的数据,现在也可以使用LoadCallHistory函数。然而,我不太确定如何从页面方法中刷新gridview。我正在处理gridview的数据绑定。 - frenchie
你能看看我的另一个问题吗?我现在卡住了,我觉得这可能是因为我做错了什么:http://stackoverflow.com/questions/4952156/ajax-with-page-method - frenchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接