簡體   English   中英

從Javascript調用C#方法的最簡單方法是什么?

[英]What is the easiest way to call a C# method from Javascript

我有一個LinkBut​​ton控件,我需要添加ac#方法。 目前,當我使用解析控件並將控件添加到頁面時,它會更改對javascript的調用,並且我得到了未定義。 我想辦法解決這個問題,就是定義一個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>

你不能這樣做。 Javascript存在於客戶端上。 服務器上存在C#代碼。 他們不可能彼此有任何背景知識。 服務器代碼運行以響應HTTP請求。

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

但是,您可以查看一些類似這樣的文章: 使用Ajax擴展的客戶端Web服務調用

編輯:通過編輯,聽起來你只想讓你的按鈕回發到服務器。 這是ASP.Net的核心功能,很容易做到。 正如其他答案所示,您只需要在服務器代碼中連接一個click事件處理程序。

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

更新:由於您使用的是LinkBut​​ton,因此您只需在代碼隱藏中定義一個單擊處理程序

button.Click += button_Click

示例:通過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>

你正在尋找WebMethods,這里有一個jquery的例子,但可以很容易地適應基本的javascript。 好的醬是在“PageMethods.SomeMethod”部分。

我公司的工具包中,我們實現了一種稱為遠程調用的技術。 它由兩部分組成 - 在客戶端,有一個名為RemoteInvoke()的javascript方法,它接受方法名稱和傳遞給方法的參數數組。 在服務器端,您使用屬性[RemoteInvokable]裝飾要調用的公共方法。 RemoteInvoke盡可能匹配簽名(如果需要,鍵入轉換),然后調用適當的公共方法(如果找到一個)。

它不是像點擊動作那么簡單的東西,但是如果你需要更復雜的東西,它會很有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM