代码之家  ›  专栏  ›  技术社区  ›  Radu

从静态函数访问控件属性

  •  0
  • Radu  · 技术社区  · 14 年前

    我得到的是:

    <textarea id="TextArea1" rows="6" cols="20" runat="server"></textarea>
    

    partial class _Default : System.Web.UI.Page
    {
        [Webmethod()]
        public static void Data(int TestNum)
        {
            if (TestNum > 0) TextArea1.InnerText = "hello world";
        }
    }
    

    我得到以下错误:

    Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.

    据我所知,我需要在共享函数中声明类的一个实例,如下所示:

    _Default NewInstance = New _Default();
    NewInstance.TextArea1.InnerText = "hello world";
    

    我的问题是,我有没有办法避免这样做?这是一个糟糕的做法吗?我这样做会造成什么样的记忆或性能损失?

    非常感谢。

    Edit:我应该提到静态声明对于WebMethods是必要的

    4 回复  |  直到 14 年前
        1
  •  1
  •   flatline    14 年前

    如果意图通过异步回调更改页面上的textarea,最好的选择是将其包装在UpdatePanel中,或者使用类似JQuery之类的工具手工执行ajax调用。在后一种情况下,只能从javascript引用textarea并异步获取内容。

        2
  •  1
  •   Heinzi    14 年前

    你需要移除 static 从你的 Data

        3
  •  1
  •   Henk Holterman    14 年前

    别让它静止。。。

    [Webmethod()]
    public string Data(int TestNum)
    {
        TextArea1.InnerText = "hello world";
    }
    
        4
  •  1
  •   Hannele    12 年前

    让我们把这些东西叫做什么。它们是页面方法,需要声明为static(C#)/Shared(VB)。

    这些页面方法无法访问页面变量的原因是:您必须将其视为客户机和服务器。服务器从客户端获取请求。服务器向客户端提供页面,在服务器上进行任何“抛光”。一旦服务器将数据发送到客户机,服务器就会忘记“抛光”的内容,甚至忘记其存在。您的客户端页面现在是孤立的。服务器一直忙于输出更多的孤儿。你的服务员真是个婊子。它没有时间跟上它生成的页面的每个实例,特别是如果每天/每小时有数百万人访问您的服务器。客户端在.Net中刷新服务器内存的方式通常是通过postbacks、viewstate等机制。否则,服务器会说,不,你不是我的孩子。

    ajax和页面方法应运而生。Ajax收集服务器执行应用程序所需的基本处理所需的关键信息并发回信息。这方面的通信媒介通常是页面方法的JSON。所以现在服务器变成了一个计算器或者存储信息的存储器,但是客户端仍然需要知道要发送什么信息,如何发送信息,以便服务器为您做任何事情。这是外行对事情的解释。