如何在aspx.cs代码隐藏中从静态方法调用非静态方法

本文关键字:静态方法 调用 隐藏 代码 aspx cs | 更新日期: 2023-09-27 18:15:13

在其他地方也有人问过类似的问题,但答案似乎不适用于我的特殊情况。
我在aspx页面上有一个隐藏字段:

<asp:HiddenField ID="dataReceiver" runat="server" Value="" />

我正试图从后台代码访问此字段。似乎我必须从VS2010自动生成的默认类中引用它。由于我不能创建一个新类,所以我尝试了以下操作:

1public partial class _Default : System.Web.UI.Page
2{
3   protected void Page_Load(object sender, EventArgs e)
4   {
5       Data2();
6       MessageBox.Show(dataReceiver.Value);
7   }
8   public void Data1()
9   {
10      dataReceiver.Value = "123456";
11  }
12  public static void Data2()
13  {
14      _Default def = new _Default();
15      def.Data1();
16  }
17}

这会在第10行产生一个错误:"对象引用未设置为对象的实例。"

我也试过将第14行输入为"_Default def = new _Default().Data1();",但这被编译器拒绝,并出现错误:"不能隐式地将类型'void'转换为'WebApplication6._Default'"

有办法做到这一点,还是我需要一个完全不同的方法?

[编辑]Darin下面的回答为我解决了这个问题,但我确实花了一点时间来弄清楚如何应用这些信息。我想我应该澄清解决方案的细节,以防有人读到类似的问题。
尽管WebMethod不能调用实例方法,而且它似乎不能访问页面的元素,不管它们的"runat"属性如何,但它可以向调用它的JavaScript方法返回一个值。该值将在JavaScript中作为名为"result"的局部变量访问,该变量将传递给"success"或"failure"函数。

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:ScriptManager id="scriptManager1" runat="server" EnablePageMethods= "true" />
<asp:HiddenField ID="dataReceiver" runat="server" Value="789" />
</asp:Content>
//Javascript
function callServer() {
    PageMethods.Data2($("#MainContent_dataReceiver").attr("value").toString(), success, failure);
    function success(result, userContext, methodName) { alert(result + " . " + userContext + " . " + methodName); }
    function failure(result, userContext, methodName) { alert(result + " . " + userContext + " . " + methodName); }
}
//C# Code Behind
[WebMethod]
public static string Data2(string value)
{
    value = "101112";
    return value;
}

如何在aspx.cs代码隐藏中从静态方法调用非静态方法

在ASP中不能从PageMethod访问实例字段。. NET,我怀疑这就是你在这里想要实现的。事情就是这样,你对此无能为力。所以我建议你让你的page方法把隐藏字段的值作为参数:

public static void Data2(string value)
{
    ... do something with the value of the hidden field
}

现在让page方法的调用者提供所需的值,因为它在页面的上下文中。

不清楚这里发生了什么-您想要实现什么。您正在接收错误,因为_Default的无参数构造函数可能没有将dataReceiver设置为有用的值。

是否有任何原因Data2() 需要是一个静态方法?它逻辑上调用Data1()应该是什么?你不应该只是决定,因为你需要调用Data1()一些实例,这是可以的,只是创建一个新的_Default的实例,并调用它。计算出调用的逻辑目的,这应该表明您需要在哪个实例上调用Data1() -或者这实际上应该是一个实例方法来开始。

为什么要创建一个新的实例:_Default def = new _Default();,使用dataReceiver.Value来访问它。如果控件指定了runat=server,则意味着您可以从后面的代码中访问该控件。

为什么Data1是一个实例方法?我们需要更多的信息