什么是从Javascript调用C#方法的最简单方法
我有一个LinkButton控件,我需要添加一个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("dnn$ctr954$ViewPromotions$LinkButton2", "", true, "", "", 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("dnn$ctr954$ViewPromotions$test", "", true, "", "", false, true))">mybutton</a>
您可以使用C#编写的javascript调用WebService或PageMethod。
更新:由于您使用的LinkButton,你可以简单地在你的代码隐藏定义click handler:
button.Click += button_Click
也许我错过了一些问题,但使用内置的点击处理程序看起来像是最简单,最好的事情。接得好。 +1 – Greg 2010-02-18 17:17:13
我第一次回答时错过了LinkButton部分。但是,是的,我认为他正在寻找的只是一个点击处理程序。 – jrummell 2010-02-18 17:18:29
我试过这第一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
你本身无法做到这一点。 Javascript存在于客户端。 C#代码存在于服务器上。他们不可能有任何对方的背景知识。 服务器代码响应HTTP请求而运行。
这就是说,你可以在C#中创建一个web服务方法,并使用javascript调用它。从你的问题的背景来看,它可能不会做你想做的事。 Web服务方法是静态的,与常规回发没有相同的上下文。
但是,你可以检查出像这样的几篇文章:Client-Side Web Service Calls with Ajax Extensions
编辑:随着你的编辑,这听起来像你只是想使你的按钮回发到服务器。这是ASP.Net的核心功能,并且很容易完成。如其他答案所示,您只需在服务器代码中挂接一个单击事件处理程序。
不,这是一个更多的参与,因为我正在寻找一个快速解决我遇到的问题,请参阅我的其他问题: http://stackoverflow.com/questions/2289831/parsecontrol-in-dotnetnuke-asp- net-changing-on-click-javascript-instead-of-cm – 2010-02-18 17:27:24
您正在寻找的WebMethods,有一个例子with jquery这里,但可以很容易地适应基本的JavaScript 。好的酱在“PageMethods.SomeMethod”部分。
试过这个,它不会触发该功能。 – 2010-02-18 18:26:47
示例:通过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>
这远不是那么容易:-)但是,似乎并不正确。 – 2010-02-18 18:26:30
在my company的工具包,我们实现了我们称之为remote invoke的技术。它由两部分组成 - 在客户端,有一个名为RemoteInvoke()的JavaScript方法,它接收一个方法名和一个参数数组传递给方法。在服务器端,您将使用属性[RemoteInvokable]修饰您想调用的公共方法。 RemoteInvoke尽可能匹配签名(如果需要,输入类型),然后调用适当的公共方法(如果找到了它)。
这不是像点击操作那样简单的事情,但是如果你需要更复杂的事情,它会工作得很好。
哇,这是整洁!感谢信息! – 2010-02-18 20:06:31
我对C#一无所知,所以我不会添加这个答案。但是,你不会用ajax做到这一点吗?调用C#页面,当页面加载时,它可以执行该方法。 – 2010-02-18 17:08:12
是的,我现在正在尝试。 – 2010-02-18 17:12:05