Как вызвать нестатический метод из статического метода в программном обеспечении aspx.cs - PullRequest
0 голосов
/ 19 ноября 2011

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

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

[EDIT] Ответ Дарина ниже решил это для меня, но мне потребовалось немного времени, чтобы понять, как применить информацию. Я подумал, что должен уточнить детали решения на тот случай, если кто-нибудь прочтет это позже с похожей проблемой.
Хотя 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 ]

2 голосов
/ 19 ноября 2011

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

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

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

1 голос
/ 19 ноября 2011

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

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

0 голосов
/ 19 ноября 2011

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

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

...