在没有回发的情况下从 LinkButton 调用 C# 方法(使用 PageMethod)(MasterPage 网站)
Calling C# method (using PageMethod) from LinkButton without postback (MasterPage website)
我使用 MasterPage 在 ASP 页面中动态创建了几个 LinkButton。在一个单独的 JavaScript 文件中,我有一个 JS 函数,它在单击时更改 LinkButton 的文本,即 "Yes" 到 "No" ,反之亦然。它有点像 "Like" 按钮。因此,当人们单击 LinkButton 时,页面必须保持静态(否则会很烦人)。
单击 LinkButton 时必须执行带参数的 C# 方法。
我将此单击 属性 添加到 LinkButton,以使用单独 C# Class 文件中的方法:
MyLinkButton.Click += (sender, e) => { MyClass.MyClick(par1, par2); };
但问题是,如果我添加以下内容 属性 以防止回发并在单击 LinkButton 时保持页面静态:
MyLinkButton.Attributes.Add("href", "javascript:;");
它不再运行 MyClass 文件中的 MyClick 方法。
所以我尝试从 JS 代码调用 MyClick 方法,该方法使用 PageMethod 在单击时执行 "Yes" 到 "No" 的更改。
在 MyClass 中我添加了:对 System.Web.Services 的引用并将 [WebMethod] 放在public static void MyClick() 方法。
还在 body/form 内的我的 MasterPage 文件中添加了一个 ScriptManager 并设置属性 EnablePageMethods="true".
问题是,无论是否在 LinkButton 上设置了 ("href", "javascript:;") 属性,PageMethod 都不会调用 MyClick 方法我的 Class 文件。我尝试了以下两种方式:
PageMethods.MyClick(par1, par2)
和
PageMethods.MyClass.MyClick(par1, par2)
而且两者都没有触发该方法。我很感激任何意见或建议。
我的 2 美分:我认为这是因为您试图 运行 服务器代码而不向服务器发送必要的信息。没有回发,您不能指望服务器处理该事件。
不确定 ASP 中是否有办法做到这一点。也许您可以使用 AJAX 调用,但我从未将其用于此特定目的。
如果您想在没有回传的情况下调用服务器,您必须使用 UpdatePanel
或本机 Ajax
函数。在你的情况下,我相信 UpdatePanel
是最好的。
将您的字段和按钮放入 UpdatePanel 中,然后一切都会正常工作,就像变魔术一样。
要了解如何使用 UpdatePanel,请查看
https://msdn.microsoft.com/en-us/library/bb386454.aspx
link 按钮的工作方式是,它的 href
指向 __doPostBack
JavaScript 方法。这会触发一条消息发送到服务器。由于您已将 href
替换为 javascript:
,本质上是“什么都不做”,这就解释了您所看到的行为。
如果你想在不重新加载页面的情况下向服务器发送数据,你需要使用AJAX。主要有两种方法,一种是UpdatePanel,大多数人,包括我自己,都会反对这种模式。为什么?那么这样想吧,根据你告诉我的,你有一个“喜欢”按钮。我猜你的服务器端方法需要两条数据,一些标识他们喜欢什么的 ID 和一个表示喜欢或不喜欢的布尔值。如果您使用 UpdatePanel,整个 ViewState 必须往返于服务器。此外,服务器将使用 UpdatePanel 中所有内容的完整 HTML 内容进行响应。互联网上有很多不错的文章,这些文章都比较详细,如果您有兴趣,可以点击这里 one,但我已经总结了要点。如果您正在尝试构建一个轻量级、快速的现代网站,那么这不是可行的方法。如果你想快速完成某件事并且不想写 JavaScript,那可能是这样,但是 JavaScript 几乎是现代网络的一个要求。
或者,您可以直接使用 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 来说太过分了。这是 Microsoft 在开发人员无需做太多工作的情况下实现 AJAX 的尝试。就像 ViewState 一样,它也是有代价的。价格能不能接受就看你了
我使用 MasterPage 在 ASP 页面中动态创建了几个 LinkButton。在一个单独的 JavaScript 文件中,我有一个 JS 函数,它在单击时更改 LinkButton 的文本,即 "Yes" 到 "No" ,反之亦然。它有点像 "Like" 按钮。因此,当人们单击 LinkButton 时,页面必须保持静态(否则会很烦人)。 单击 LinkButton 时必须执行带参数的 C# 方法。
我将此单击 属性 添加到 LinkButton,以使用单独 C# Class 文件中的方法:
MyLinkButton.Click += (sender, e) => { MyClass.MyClick(par1, par2); };
但问题是,如果我添加以下内容 属性 以防止回发并在单击 LinkButton 时保持页面静态:
MyLinkButton.Attributes.Add("href", "javascript:;");
它不再运行 MyClass 文件中的 MyClick 方法。
所以我尝试从 JS 代码调用 MyClick 方法,该方法使用 PageMethod 在单击时执行 "Yes" 到 "No" 的更改。
在 MyClass 中我添加了:对 System.Web.Services 的引用并将 [WebMethod] 放在public static void MyClick() 方法。 还在 body/form 内的我的 MasterPage 文件中添加了一个 ScriptManager 并设置属性 EnablePageMethods="true".
问题是,无论是否在 LinkButton 上设置了 ("href", "javascript:;") 属性,PageMethod 都不会调用 MyClick 方法我的 Class 文件。我尝试了以下两种方式:
PageMethods.MyClick(par1, par2)
和
PageMethods.MyClass.MyClick(par1, par2)
而且两者都没有触发该方法。我很感激任何意见或建议。
我的 2 美分:我认为这是因为您试图 运行 服务器代码而不向服务器发送必要的信息。没有回发,您不能指望服务器处理该事件。 不确定 ASP 中是否有办法做到这一点。也许您可以使用 AJAX 调用,但我从未将其用于此特定目的。
如果您想在没有回传的情况下调用服务器,您必须使用 UpdatePanel
或本机 Ajax
函数。在你的情况下,我相信 UpdatePanel
是最好的。
将您的字段和按钮放入 UpdatePanel 中,然后一切都会正常工作,就像变魔术一样。
要了解如何使用 UpdatePanel,请查看
https://msdn.microsoft.com/en-us/library/bb386454.aspx
link 按钮的工作方式是,它的 href
指向 __doPostBack
JavaScript 方法。这会触发一条消息发送到服务器。由于您已将 href
替换为 javascript:
,本质上是“什么都不做”,这就解释了您所看到的行为。
如果你想在不重新加载页面的情况下向服务器发送数据,你需要使用AJAX。主要有两种方法,一种是UpdatePanel,大多数人,包括我自己,都会反对这种模式。为什么?那么这样想吧,根据你告诉我的,你有一个“喜欢”按钮。我猜你的服务器端方法需要两条数据,一些标识他们喜欢什么的 ID 和一个表示喜欢或不喜欢的布尔值。如果您使用 UpdatePanel,整个 ViewState 必须往返于服务器。此外,服务器将使用 UpdatePanel 中所有内容的完整 HTML 内容进行响应。互联网上有很多不错的文章,这些文章都比较详细,如果您有兴趣,可以点击这里 one,但我已经总结了要点。如果您正在尝试构建一个轻量级、快速的现代网站,那么这不是可行的方法。如果你想快速完成某件事并且不想写 JavaScript,那可能是这样,但是 JavaScript 几乎是现代网络的一个要求。
或者,您可以直接使用 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 来说太过分了。这是 Microsoft 在开发人员无需做太多工作的情况下实现 AJAX 的尝试。就像 ViewState 一样,它也是有代价的。价格能不能接受就看你了