Доступ к атрибутам управления из статической функции - PullRequest
0 голосов
/ 16 сентября 2010

Вот что у меня есть:

<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";

Мой вопрос: можно ли как-нибудь избежать этого? Это плохая практика и какой объем памяти или потери производительности я понесу за это?

Спасибо.

Редактировать: я должен упомянуть, что статическое объявление необходимо для WebMethods

Ответы [ 4 ]

1 голос
/ 14 июня 2011

Давайте назовем эти вещи такими, какие они есть.Это методы страницы, и они должны быть объявлены статическими (C #) / Shared (VB).

Причина, по которой эти методы страницы не могут получить доступ к переменным страницы: вы должны думать об этом как о клиенте и сервере.Сервер получает запрос от клиента.Сервер подает страницу клиенту, выполняя любую «полировку» на сервере.Как только сервер отправляет данные клиенту, сервер забывает, что «отполированный» контент даже существует.Ваша страница на стороне клиента теперь сирота.Сервер слишком занят, извергая все больше сирот.Твой сервер такая шлюха.У него нет времени, чтобы не отставать от каждого экземпляра страницы, которую он рождает, особенно если у вас есть миллионы людей, обращающихся к вашему серверу каждый день / час.Клиент обновляет серверную память в .Net, как правило, с помощью таких механизмов, как обратные передачи, viewstate и т. Д. В противном случае сервер скажет: «Нет, вы не мой ребенок».

Входит ajax и методы страницы.Ajax собирает ключевую информацию, необходимую серверу для выполнения базовой обработки, требуемой приложением, и отправляет обратно информацию.Средой коммуникации для этого обычно является JSON для методов Page.Таким образом, теперь сервер становится просто калькулятором или хранилищем информации, но клиент все еще должен знать, какую информацию отправлять, как ее отправлять, чтобы сервер что-то сделал для вас.Это объяснение непрофессионала для вещей.

1 голос
/ 16 сентября 2010

Если вы хотите изменить текстовое поле на странице с помощью асинхронного обратного вызова, лучше всего обернуть его в UpdatePanel или использовать что-то вроде JQuery для выполнения вызова ajax вручную.В последнем случае вы будете ссылаться только на текстовую область из JavaScript и извлекать содержимое асинхронно.

1 голос
/ 16 сентября 2010

Не делай это статичным ...

[Webmethod()]
public string Data(int TestNum)
{
    TextArea1.InnerText = "hello world";
}
1 голос
/ 16 сентября 2010

Вам необходимо удалить модификатор static из вашего метода Data.

...