Как вызвать нестатический метод из статического метода в программном обеспечении aspx.cs

Подобный вопрос был задан в другом месте, но ответ, похоже, не работает в моей конкретной ситуации.
У меня есть скрытое поле на странице 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 ""

Есть ли способ сделать эту работу, или мне нужен совершенно другой подход?

[РЕДАКТИРОВАТЬ] Ответ Дарина ниже решил это для меня, но мне понадобилось некоторое время, чтобы выяснить, как применить информацию. Я подумал, что должен уточнить детали решения на тот случай, если кто-нибудь прочтет это позже с похожей проблемой.
Хотя WebMethod не может вызвать метод экземпляра и, похоже, не может получить доступ к элементам страницы независимо от их атрибута "runat", он может вернуть значение методу JavaScript, вызывающему его. Это значение будет доступно в JavaScript как локальная переменная с именем "result", которая передается в функции "success" или "fail".

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

3 ответа

Решение

Вы не можете получить доступ к полям экземпляра из PageMethod в ASP.NET, который, я подозреваю, является тем, чего вы пытаетесь достичь здесь. Вот как это так, и вы ничего не могли с этим поделать. Поэтому я бы порекомендовал, чтобы ваш метод страницы принял значение скрытого поля в качестве аргумента:

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

Теперь позвольте вызывающему методу страницы указать требуемое значение, поскольку оно находится в контексте страницы.

Непонятно, что здесь происходит - чего вы пытаетесь достичь. Вы получаете ошибку, потому что предположительно конструктор без параметров для _Default не устанавливается dataReceiver к полезной стоимости.

Есть ли причина, почему Data2() должен быть статический метод? Что это должно логически вызывать Data1() на? Вы не должны просто решить это, потому что вам нужно позвонить Data1() в некоторых случаях, это нормально, просто создать новый экземпляр _Default и назовите это на этом. Определите логическую цель вызова, и это должно указать, какой экземпляр вам нужно вызвать Data1() on - или действительно ли это должен быть метод экземпляра для начала.

Почему вы создаете новый экземпляр: _Default def = new _Default();, для доступа к нему используйте dataReceiver.Value, Если элемент управления указывает runat=server это означает, что вы можете получить доступ к элементу управления внутри кода.

Почему Data1 метод экземпляра? Нам нужно больше информации.

Другие вопросы по тегам