2011-11-18 3 views
0

비슷한 질문이 다른 곳에서 요청되었지만 특정 상황에서 응답이 작동하지 않는 것 같습니다.
가 나는 aspx 페이지에 숨겨진 필드가 있습니다 : 나는 코드 숨김에서이 ​​필드에 액세스하기 위해 노력하고있어aspx.cs 코드 숨김에서 정적 메서드에서 비 정적 메서드를 호출하는 방법

<asp:HiddenField ID="dataReceiver" runat="server" Value="" /> 

. VS2010에 의해 자동으로 생성되는 기본 클래스 내에서 참조해야하는 것 같습니다. 새로운 수업을 만들 수 없기 때문에 다음과 같이 해 보았습니다. 이 라인 10에서 오류가 발생

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} 


은 : "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."

줄 14도 "_default def = new _Default(). Data1();"이라고 입력 해 보았습니다. 그러나 컴파일러는 다음과 같은 오류로이를 거부합니다. "암시 적으로 'void'를 'WebApplication6._Default'로 변환 할 수 없습니다."

이 작업을 수행 할 수있는 방법이 있습니까, 아니면 완전히 다른 접근 방식이 필요합니까?

[편집] 아래의 대린의 답변은이 문제를 해결했지만 정보를 적용하는 방법을 파악하는 데 다소 시간이 걸렸습니다. 나는 누군가가 나중에 비슷한 문제를 읽는 경우 해결책의 세부 사항을 분명히해야한다고 생각했다.
WebMethod는 인스턴스 메서드를 호출 할 수 없지만 "runat"특성에 관계없이 페이지의 요소에 액세스 할 수있는 것 같지 않지만 호출하는 JavaScript 메서드에 값을 반환 할 수 있습니다. 값은 "success"또는 "failure"함수로 전달되는 "result"라는 로컬 변수로 JavaScript에서 액세스 할 수 있습니다. 새 인스턴스를 작성하는 이유는

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

이 컨트롤이있는'.aspx' 페이지의'@ Page' 지시문은 어떻게 생겼습니까? – Oded

+1

Page_Load 메서드에서 Data1을 직접 호출하지 않는 이유는 무엇입니까? –

+0

@ThomasLevesque - Data1을 호출하기 위해 클래스의 인스턴스가 필요하기 때문입니다. – JonH

답변

2

여기서 실현하려는 것으로 의심되는 ASP.NET의 PageMethod에서 인스턴스 필드에 액세스 할 수 없습니다. 그렇게하는 방법이며, 그것에 대해 할 수있는 일이별로 없습니다.

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

는 이제이의 맥락에 있기 때문에 페이지 메소드의 호출자가 필요한 값을 제공 할 수 : 그래서 추천 할 것입니다 무엇을 당신은 단순히 페이지의 방법은 인수로 숨겨진 필드의 값을하는 것입니다 페이지.

+0

대린 - 그 덕분에! 감사! –

+1

마음을 읽는 데 +1 ... –

+0

농담이 없습니다. 나는 내가 더 명확했다라고 생각했다. 그러나 나는 두 개의 세부를 포함하는 것을 명확히 잊었다. –

0

: 그것은 dataReceiver.Value를 사용 _Default def = new _Default();는 액세스 할 수 있습니다. 컨트롤에 runat=server이 지정되면 코드 내에서 컨트롤에 액세스 할 수 있음을 의미합니다.

Data1이 인스턴스 메서드입니까? 우리는 더 많은 정보가 필요합니다.

+0

응답 주셔서 고마워요. dataReceiver는 Data2() 내에서 사용할 수 없습니다. 정적이기 때문에 추측하겠습니다. Data1() 내에서 사용할 수 있지만 Data1에서 Data2가 호출되면 런타임 오류가 발생합니다. Data1이 인스턴스 메서드 인 이유에 대해 대답 할 수 있는지 확신 할 수 없습니다. 예를 들어, 사용자가 무언가를 클릭 할 때 페이지가로드 된 후 dataReceiver의 값을 변경하기 만하면됩니다. –

1

여기에서 무슨 일이 일어나고 있는지 명확하지 않습니다. _Default에 대한 매개 변수없는 생성자가 dataReceiver을 유용한 값으로 설정하지 않았기 때문에 오류가 발생했습니다.

Data2()이 정적 방법이어야하는 이유가 있습니까? 뭐야 논리적으로Data1() 전화 할거야? Data1() 인스턴스로 호출해야하기 때문에 _Default이라는 새 인스턴스를 만든 다음 호출하면됩니다. 논리적 인 작업을 수행하여 호를 호출하면 Data1()을 호출해야하는 인스턴스가 있는지 여부 또는이 인스턴스를 실제로 인스턴스 메서드로 사용해야하는지 여부를 나타냅니다.

+0

응답 주셔서 고마워요. Data2는 원래 코드에서 가져온 코드가 WebMethod이기 때문에 정적이어야합니다. 내 원래 게시물에서 언급하지 못한 것에 대해 사과드립니다 ... –

+0

@BrandonRoss : 'WebMethod'인 경우 페이지의 인스턴스를 참조해야하는 이유는 무엇입니까? 그 페이지는 논리적으로 존재하지 않습니다. 그것은 당신의 디자인에서 근본적인 문제 인 것처럼 들리지만 순간적으로 구현을 무시하고 * 논리적 * 디자인에 대해 생각해보십시오. –

+0

나는 좋은 디자인의 가치를 이해할 수있다. 그러나 이것은 내가 작업하고있는 프로젝트의 유일한 잠재적 인 디자인 결함이되는 것과는 거리가 멀다. 나는 여전히 배우고 있으며 마스터 프로그래머가 프로세스를 통해 내 손을 잡고 있지 않습니다. 결국 나는 되돌아 가서 내가해야만한다면 내 자신의 자유 시간에 모든 것을 리팩토링 할 것이다. 당신의 충고를 명심하십시오. 감사! –

관련 문제