Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javascript调用C#方法最简单的方法是什么_C#_Asp.net_Javascript_Dotnetnuke - Fatal编程技术网

从Javascript调用C#方法最简单的方法是什么

从Javascript调用C#方法最简单的方法是什么,c#,asp.net,javascript,dotnetnuke,C#,Asp.net,Javascript,Dotnetnuke,我有一个LinkButton控件,需要添加一个c#方法。当前,当我使用parse控件并将该控件添加到页面时,它会更改对javascript的调用,并且我没有定义。我想解决这个问题的一种方法是定义一个javascript函数,从后面的代码中调用c#方法,但我不知道如何做到这一点 特别是当点击链接按钮时,我需要javascript将链接按钮的ID传递给C方法 我试过这个: foreach (Control Control in myctrl.Controls) {

我有一个LinkButton控件,需要添加一个c#方法。当前,当我使用parse控件并将该控件添加到页面时,它会更改对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服务方法是静态的,不具有与常规回发相同的上下文

但是,您可以查看以下几篇文章:

编辑:通过编辑,听起来您只是想将按钮发回服务器。这是ASP.Net的核心功能,易于实现。正如其他答案所建议的,您只需要在服务器代码中连接一个click事件处理程序。

您可以从用C#编写的javascript调用或

更新:由于您使用的是LinkButton,您只需在codebehind中定义一个:

button.Click += button_Click

您正在寻找WebMethods,这里有一个示例,但可以轻松地适应基本javascript。“PageMethods.SomeMethod”部分是好的佐料。

示例:通过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
// 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>
[WebMethod]
公共静态名称值[]GetPageQueryList()
{
HttpRequest q=myRequest;
NameValueCollection n=q.QueryString;
List thisList=新列表();
如果(n.HasKeys())
{
对于(int i=0;i
/*******************************javascript代码***************/

   [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
// 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>
//从ajax结果设置查询选项
函数testLoadQuery(jdata)
{
var选项=“”;
对于(var i=0;i
在的工具包中,我们实现了一种我们称之为的技术。这由两部分组成-在客户端,有一个名为RemoteInvoke()的javascript方法,该方法接受一个方法名和一个参数数组以传递给该方法。在服务器端,您可以使用属性[RemoteInvokable]来修饰要调用的公共方法。RemoteInvoke尽可能地匹配签名(如果需要,键入casting),然后调用适当的公共方法(如果找到)


它不适用于像单击操作这样简单的操作,但如果您需要更复杂的操作,它将非常有效。

我对C#一无所知,因此我不会将此添加为答案。但是你不会用ajax吗?调用C#页面,当加载该页面时,它可以执行该方法。是的,我现在正在尝试。也许我遗漏了问题中的某些内容,但使用内置的单击处理程序似乎是最简单、最好的方法。接得好+1当我第一次回答时,我错过了链接按钮部分。但是,是的,我认为他想要的只是一个点击处理程序。我在我的帖子中第一次尝试了这一点,这就是导致我的问题的原因,因为我正在使用DotNetNuke,请查看关于我为什么会在这一点上的其他问题:不,这有点复杂,因为我正在寻找一个快速解决我遇到的问题的方法,请查看我的其他问题: