2010-02-18 265 views
2

我有一個LinkBut​​ton控件,我需要添加一個c#方法。目前,當我使用解析控制並將控件添加到頁面時,它會將調用更改爲JavaScript,並且我得到未定義的內容。我想一個解決這個問題的方法是定義一個javascript函數,它可以從後面的代碼調用c#方法,但我無法弄清楚如何執行此操作。什麼是從Javascript調用C#方法的最簡單方法

特別當單擊鏈接按鈕時我需要javascript將鏈接的ID傳遞給C#方法

我已經試過這樣:

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()); 

     } 

當點擊它永遠不會觸發。這裏是生成的代碼:

<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頁面,它工作正常:

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

我得到這個工作得很好:

<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#一無所知,所以我不會添加這個答案。但是,你不會用ajax做到這一點嗎?調用C#頁面,當頁面加載時,它可以執行該方法。 – 2010-02-18 17:08:12

+0

是的,我現在正在嘗試。 – 2010-02-18 17:12:05

回答

4

您可以使用C#編寫的javascript調用WebServicePageMethod

更新:由於您使用的LinkBut​​ton,你可以簡單地在你的代碼隱藏定義click handler

button.Click += button_Click 
+0

也許我錯過了一些問題,但使用內置的點擊處理程序看起來像是最簡單,最好的事情。接得好。 +1 – Greg 2010-02-18 17:17:13

+0

我第一次回答時錯過了LinkBut​​ton部分。但是,是的,我認爲他正在尋找的只是一個點擊處理程序。 – jrummell 2010-02-18 17:18:29

+0

我試過這第一beofre我的帖子,這是什麼導致我的問題,因爲我使用DotNetNuke,請參閱其他問題,爲什麼我在這一點:http://stackoverflow.com/questions/2289831/parsecontrol -in-dotnetnuke-asp-net-changing-on-click-to-javascript-instead-of-cm – 2010-02-18 17:36:16

7

你本身無法做到這一點。 Javascript存在於客戶端。 C#代碼存在於服務器上。他們不可能有任何對方的背景知識。 服務器代碼響應HTTP請求而運行。

這就是說,你可以在C#中創建一個web服務方法,並使用javascript調用它。從你的問題的背景來看,它可能不會做你想做的事。 Web服務方法是靜態的,與常規回發沒有相同的上下文。

但是,你可以檢查出像這樣的幾篇文章:Client-Side Web Service Calls with Ajax Extensions

編輯:隨着你的編輯,這聽起來像你只是想使你的按鈕回發到服務器。這是ASP.Net的核心功能,並且很容易完成。如其他答案所示,您只需在服務器代碼中掛接一個單擊事件處理程序。

+0

不,這是一個更多的參與,因爲我正在尋找一個快速解決我遇到的問題,請參閱我的其他問題: http://stackoverflow.com/questions/2289831/parsecontrol-in-dotnetnuke-asp- net-changing-on-click-javascript-instead-of-cm – 2010-02-18 17:27:24

0

您正在尋找的WebMethods,有一個例子with jquery這裏,但可以很容易地適應基本的JavaScript 。好的醬在「PageMethods.SomeMethod」部分。

+0

試過這個,它不會觸發該功能。 – 2010-02-18 18:26:47

1

示例:通過ajax從後端加載頁面查詢 注意假設是正在使用jQuery ...只是一個樣本

/************ c#代碼************************/

[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 

/******************************* javascript代碼********** *****/

// 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

這遠不是那麼容易:-)但是,似乎並不正確。 – 2010-02-18 18:26:30

0

my company的工具包,我們實現了我們稱之爲remote invoke的技術。它由兩部分組成 - 在客戶端,有一個名爲RemoteInvoke()的JavaScript方法,它接收一個方法名和一個參數數組傳遞給方法。在服務器端,您將使用屬性[RemoteInvokable]修飾您想調用的公共方法。 RemoteInvoke儘可能匹配簽名(如果需要,輸入類型),然後調用適當的公共方法(如果找到了它)。

這不是像點擊操作那樣簡單的事情,但是如果你需要更復雜的事情,它會工作得很好。

+0

哇,這是整潔!感謝信息! – 2010-02-18 20:06:31

相關問題