Как вызвать нестатический метод из статического метода в программном обеспечении 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
метод экземпляра? Нам нужно больше информации.