我有一个LinkButton控件,我需要添加一个c#方法。目前,当我使用解析控件并将控件添加到页面时,它会更改对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("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>
答案 0 :(得分:7)
你不能这样做。 Javascript存在于客户端上。服务器上存在C#代码。他们不可能彼此有任何背景知识。 服务器代码运行以响应HTTP请求。
话虽这么说,您可以在C#中创建一个Web服务方法,并使用javascript调用它。从你的问题的背景来看,它可能不会做你想要的。 Web服务方法是静态的,并且与常规回发没有相同的上下文。
但是,您可以查看一些类似这样的文章:Client-Side Web Service Calls with Ajax Extensions
编辑:通过编辑,听起来您只想让按钮回发到服务器。这是ASP.Net的核心功能,很容易做到。正如其他答案所示,您只需要在服务器代码中连接一个单击事件处理程序。
答案 1 :(得分:4)
您可以使用C#编写的javascript调用WebService或PageMethod。
更新:由于您使用了LinkButton,因此您只需在代码隐藏中定义click handler:
button.Click += button_Click
答案 2 :(得分: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>
答案 3 :(得分:0)
您正在寻找WebMethods,这里有一个示例with jquery,但可以轻松地适应基本的JavaScript。好的酱汁在“PageMethods.SomeMethod”部分。
答案 4 :(得分:0)
在my company的工具包中,我们实施了一项名为remote invoke的技术。它由两部分组成 - 在客户端,有一个名为RemoteInvoke()的javascript方法,它接受方法名称和传递给方法的参数数组。在服务器端,您使用属性[RemoteInvokable]装饰要调用的公共方法。 RemoteInvoke尽可能匹配签名(如果需要,键入转换),然后调用适当的公共方法(如果找到)。
这不是像点击动作那么简单的事情,但是如果你需要更复杂的东西,它会很有效。