2010-02-18 209 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

相关问题