Javascript 从LinkButton调用C#方法(使用PageMethod),无需回发(母版页网站)

Javascript 从LinkButton调用C#方法(使用PageMethod),无需回发(母版页网站),javascript,c#,asp.net,pagemethods,Javascript,C#,Asp.net,Pagemethods,我使用母版页在ASP页面中动态创建了几个链接按钮。在一个单独的JavaScript文件中,我有一个JS函数,可以在单击时将LinkButton的文本更改为“是”,反之亦然。这有点像一个“喜欢”的按钮。因此,当人们点击链接按钮时,页面必须保持静态(否则会很烦人)。 单击LinkButton时,必须执行带有参数的C#方法 我将此click属性添加到LinkButton,以使用单独C#Class文件中的方法: MyLinkButton.Click += (sender, e) => { MyCl

我使用母版页在ASP页面中动态创建了几个链接按钮。在一个单独的JavaScript文件中,我有一个JS函数,可以在单击时将LinkButton的文本更改为“是”,反之亦然。这有点像一个“喜欢”的按钮。因此,当人们点击链接按钮时,页面必须保持静态(否则会很烦人)。 单击LinkButton时,必须执行带有参数的C#方法

我将此click属性添加到LinkButton,以使用单独C#Class文件中的方法:

MyLinkButton.Click += (sender, e) => { MyClass.MyClick(par1, par2); };
但问题是,如果我添加以下属性以防止回发,并在单击LinkButton时保持页面静态:

MyLinkButton.Attributes.Add("href", "javascript:;");
它不再在MyClass文件中运行MyClick方法

因此,我尝试从JS代码中调用MyClick方法,使用PageMethod在单击时将“是”更改为“否”

在MyClass中,我添加了:对System.Web.Services的引用,并将[WebMethod]置于公共静态void MyClick()方法之上。 还将ScriptManager添加到主体/表单内的我的母版页文件中,并设置属性EnablePageMethods=“true”

问题是,无论是否在LinkButton上设置了(href”,“javascript:;”)属性,PageMethod都不会调用MyClass文件中的MyClick方法。我尝试了以下两种方法:

PageMethods.MyClick(par1, par2)


而且两者都不会触发该方法。非常感谢您的任何评论或建议。

我的2美分:我想这是因为您试图运行服务器代码,而没有向服务器发送必要的信息。如果没有回发,您无法期望服务器处理事件。
不确定在ASP中是否有这样做的方法。也许您可以使用AJAX调用,但我从未将其用于此特定目的。

如果您想在不回发的情况下调用服务器,则必须使用
UpdatePanel
或本机
AJAX
函数。在您的情况下,我相信
UpdatePanel
是最好的

把你的字段和按钮放在UpdatePanel中,然后一切都会正常工作,就像魔术一样

要了解如何使用UpdatePanel,请查看


链接按钮的工作方式是,它的
href
指向
\u doPostBack
JavaScript方法。这将触发发送到服务器的消息。由于您已将
href
替换为
javascript:
,本质上是“什么都不做”,这就解释了您看到的行为

如果希望在不重新加载页面的情况下向服务器发送数据,则需要使用AJAX。主要有两种方法,一种是UpdatePanel,包括我在内的大多数人都会反对这种模式。为什么?这样想吧,根据你告诉我的,你有一个“喜欢”按钮。我猜您的服务器端方法需要两部分数据,一部分是标识他们喜欢什么的ID,另一部分是表示喜欢或不喜欢的布尔值。如果使用UpdatePanel,则整个ViewState必须往返到服务器。此外,服务器将响应UpdatePanel中所有内容的全部HTML内容。互联网上有很多很好的文章,详细介绍了这些内容,如果你感兴趣的话,这里有一些,但我已经总结了要点。如果你想建立一个轻量级的、快速的现代网站,那就不是一个好办法。如果您试图快速完成某件事情,而不想编写JavaScript,那么可能是这样,但是JavaScript对于现代web来说几乎是一种需求

或者,您可以使用直接AJAX。这要求您在代码中放置一个方法,并用
[WebMethod]
属性修饰。这意味着现在可以通过AJAX从JavaScript调用它。以我的例子来说,你会有:

[WebMethod]
public static bool DoLike(string id, bool likeOrNotLike)
{
    // Your implementation
}
现在,你怎么称呼它。我建议您使用jQuery之类的框架来调用AJAX,因为它为您简化了很多语法。使用jQuery,您只需执行以下操作:

$.ajax({
    type: "GET",
    url: "MyPage.aspx/DoLike",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: { id: "123", likeOrNotLike: true },
    success: function (msg) {
        alert("It was called successfully");
    },
    error: function () {
        alert("An error occurred calling it");
    }
});
上面的代码向DoLike方法发送两个参数,“123”(ID)和true(likeOrNotLike)。将使用这些参数调用您的方法,就像从C#调用它一样。框架处理了所有这些问题

要将jQuery添加到页面,只需添加:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>

如果您反对jQuery,我可以修改我的答案,直接使用XMLHTTPRequest,但这会更麻烦

正如您所看到的,AJAX并不是神奇的,您不能简单地将
[WebMethod]
添加到事件处理程序中,所有这些都可以工作。事实上,如果您直接使用AJAX,您甚至不使用事件处理程序,而是直接调用服务器端方法


您当然可以按照这里其他人的建议使用UpdatePanel,它会起作用的。在我和许多其他人看来,这只是对AJAX的过度使用。这是微软在开发人员不必做太多工作的情况下实现AJAX的尝试。就像ViewState一样,它也是有代价的。价格是否合理取决于您。

在方法之前添加[WebMethod]。请仔细阅读我的帖子,这已经完成了。我明白您的观点,但这不也会给我一些错误吗?就我所阅读的内容而言,这个问题也可能与母版页文件中的页面有关,或者PageMethods调用或MyClick方法位于单独的类/JS文件中?为什么会出现错误?你的href:javascript说“什么都不做”,这非常成功,它什么都不做。正如我在帖子中所说的,没有javascript href属性集,它也什么都不做。你的回答很好。我并不反对JS/jQuery解决方案,在使用UpdatePanel之前,我将尝试一下您的建议。我试图将ajax调用放在“是”“否”脚本中,这样对我来说更符合逻辑。问题是,我不知道如何在ajax调用中,在单独的MyClass文件中精确定位MyClick方法的url。“Like”控件仍然是一个链接按钮。不用花你太多时间,你能不能给我指个方向
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>