2010-02-18 2 views
2

C# 메서드를 추가해야하는 LinkButton 컨트롤이 있습니다. 현재 구문 분석 컨트롤을 사용하여 페이지에 컨트롤을 추가하면 호출이 javascript로 변경되므로 정의되지 않습니다. 이 문제를 해결할 수있는 방법은 코드에서 C# 메서드를 호출하는 자바 스크립트 함수를 정의하는 것이지만이 작업을 수행하는 방법을 알 수는 없습니다.Javascript에서 C# 메서드를 호출하는 가장 쉬운 방법은 무엇입니까

링크 버튼을 클릭했을 때 구체적으로 링크 버튼의 ID를 C# 메소드으로 전달하려면 javascript가 필요합니다.

나는 이것을 시도 : 클릭하면 그것은 터지지 않

foreach (Control Control in myctrl.Controls) 
      { 
       if (Control is LinkButton) 
        { 
         LinkButton lb = (LinkButton)Control; 
         lb.Click += LinkButton_Click; 

        } 
       Panel1.Controls.Add(myctrl); 
      } 



public void LinkButton_Click(Object sender, EventArgs e) 
     { 
    BREAKPOINTHERE>   Console.Write(e.ToString()); 

     } 

합니다. 여기에 생성 된 코드입니다 :이 얻을

<asp:LinkButton ID="test" OnClick="LinkButton_Click" runat="server">mybutton</asp:LinkButton> 

을하고 그것을 잘 작동합니다 : 지금

<a id="dnn_ctr954_ViewPromotions_LinkButton2" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;dnn$ctr954$ViewPromotions$LinkButton2&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Get your Free 2</a> 

내 aspx 페이지에 넣고 경우는, 그것을 잘 작동

<a id="dnn_ctr954_ViewPromotions_test" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;dnn$ctr954$ViewPromotions$test&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">mybutton</a> 
+3

저는 C#에 대해 아무 것도 모르므로 대답으로 추가하지 않을 것입니다. 하지만 아약스로하지 않니? C# 페이지를 호출하고 해당 페이지가로드되면 메서드를 실행할 수 있습니다. –

+0

그래, 지금 당장 노력하고있어. –

답변

4

C#으로 작성된 자바 스크립트에서 WebService 또는 PageMethod을 호출 할 수 있습니다.

업데이트 : 당신이하는 LinkButton을 사용하기 때문에, 당신은 단순히 당신의 코드 숨김에서 click handler을 정의 할 수 있습니다 : 당신은 웹 메쏘드를 찾고

button.Click += button_Click 
+0

어쩌면 질문에 뭔가 빠졌을 것입니다. 그러나 클릭 핸들러에 내장 된 것을 사용하는 것이 가장 쉽고, 가장 좋은 방법 인 것 같습니다. 좋은 캐치. +1 – Greg

+0

제가 처음 대답했을 때 LinkButton 부분을 놓쳤습니다. 하지만 네가 찾고있는 것은 단순히 클릭 처리기 일 뿐이라고 생각합니다. – jrummell

+0

나는 내 첫 번째 beofre 내 게시물을 시도하고, 이것은 내가 DotNetNuke를 사용하여, 왜이 시점에서 다른 질문을 참조하십시오 내 문제를 일으키는 것입니다 : http://stackoverflow.com/questions/2289831/parsecontrol -in-dotnetnuke-asp-net-changing-onclick-to-javascript-of-cm –

7

당신 이 일을 할 수 없다. Javascript가 클라이언트에 있습니다. C# 코드가 서버에 있습니다. 그들은 서로의 맥락 적 지식을 가질 수 없습니다. HTTP 요청에 응답하여 서버 코드가 실행됩니다.

즉, C#에서 웹 서비스 메서드를 만들고 javascript를 사용하여 호출 할 수 있습니다. 귀하의 질문에 대한 맥락에서 볼 때, 귀하가 원하시는 바를하지 못할 수도 있습니다. 웹 서비스 메서드는 정적이며 정기적 인 포스트 백과 동일한 컨텍스트를 갖지 않습니다.

그러나이 같은 몇 가지 기사를 확인하실 수 있습니다 : Client-Side Web Service Calls with Ajax Extensions

편집 : 당신은 단지 서버에 버튼 포스트 백을 만들고 싶어처럼 편집으로, 그것은 소리. 이것은 ASP.Net의 핵심 기능이며 쉽게 수행 할 수 있습니다. 다른 대답이 제시하는 것처럼 서버 코드에서 클릭 이벤트 처리기를 연결하면됩니다.

+0

아니요, 제가 가지고있는 문제에 대한 빠른 해결 방법을 찾고있는 중입니다. 내 다른 질문을 참조하십시오. http://stackoverflow.com/questions/2289831/parsecontrol-in-dotnetnuke-asp- net-changing-onclick-to-javacript-of-cm –

0

, 여기 저기 예를 들어 with jquery하지만 쉽게 기본적인 자바 스크립트에 적용 할 수 있습니다 . 좋은 소스는 "PageMethods.SomeMethod"부분에 있습니다.

+0

이 시도했지만 기능을 실행하지 않습니다. –

1

예 : 백엔드에서 ajax를 통해 페이지 쿼리를로드하십시오. 참고 jQuery가 사용되고있는 것으로 가정합니다.단지 샘플

/**********************************/

[WebMethod] 
    public static nameValue[] GetPageQueryList() 
    { 
     HttpRequest q = myRequest; 
     NameValueCollection n = q.QueryString; 
     List<nameValue> thisList = new List<nameValue>(); 

     if (n.HasKeys()) 
     { 
      for (int i = 0; i < n.Count; i++) 
      { 
       nameValue newList = new nameValue(n.GetKey(i), n.Get(i)); 
       thisList.Add(newList); 
      }; 
     } 
     else 
     { 
      nameValue r = new nameValue("", ""); 
      thisList.Add(r); 
     }; 
     return thisList.ToArray(); 
    } 

#region nameValue 
public class nameValue 
{ 
    /// <summary> 
    /// web service/webmethod needs 0 parameter constructor 
    /// </summary> 
    public nameValue() 
    { 
    } 
    public nameValue(string name, string value) 
    { 
     Name = name; 
     Value = value; 
    } 

    public string Name; 
    public string Value; 

} 
#endregion 

/******************************* 자바 스크립트 코드 ********** *****/my company의 툴킷에서

// set the Query options from ajax results 

function testLoadQuery(jdata) 
{ 
    var options = ''; 
    for (var i = 0; i < jdata.length; i++) 
    { 
     if (jdata[i].Name === "PID") 
     { 
      queryPatientID = jdata[i].Value; 
     } 
     options += '<option value="' + jdata[i].Name + '">' + '(' + jdata[i].Name + ')' + jdata[i].Value + '</option>'; 
    }; 
    $("select.requestSelect").html(options); 
}; 
// read on page load 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: "{}", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
    typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "MyFancyPage.aspx/GetPageQueryList", 
     success: function(msg) 
     { 
      testLoadQuery(msg); 
      $("#testonlyRequest").text("Yeah QueryList did load"); 
     }, 
     failure: function(msg) 
     { 
      $("#testonlyRequest").text("oh darn QueryList did not load"); 
     } 
    }); 

/********************** the html sample *******************/ 
    <div class="testonlyRequestContainer"> 
     <div class="testonly" id="testonlyRequest"> 
      testonlyRequest</div> 
     <select class="testrequestSelect" id="testrequestSelect" title="request stuff"> 
     </select> 
    </div> 
+0

이것은 쉬운 일이 아닙니다 :-)하지만 그래 제대로 작동하지 않는 것 같습니다. –

0

, 우리는 우리가 remote invoke 전화 기술을 구현했습니다. 이것은 두 부분으로 구성됩니다 - 클라이언트 측에서 메소드에 전달할 메소드 이름과 인수 배열을 취하는 RemoteInvoke()라는 javascript 메소드가 있습니다. 서버 측에서는 [RemoteInvokable] 속성을 사용하여 호출 할 공용 메소드를 꾸미십시오. RemoteInvoke는 가능한 한 서명을 일치시키고 (필요한 경우 유형 캐스팅) 적절한 공개 메소드 (있는 경우)를 호출합니다.

클릭 동작만큼 간단한 것은 아니지만 더 복잡한 것이 필요한 경우 큰 효과가 있습니다.

+0

와우 이것은 깔끔하다! 정보 주셔서 감사합니다! –

관련 문제