在没有回发的情况下从LinkBut​​ton调用C#方法(使用PageMethod)(MasterPage网站)

时间:2015-07-24 12:06:48

标签: javascript c# asp.net pagemethods

我在带有MasterPage的ASP页面中动态创建了几个LinkBut​​tons。在一个单独的JavaScript文件中,我有一个JS函数,可以在单击时更改LinkBut​​ton的文本,即“是”到“否”,反之亦然。这是一个“喜欢”按钮。因此,当人们点击LinkBut​​ton时,页面必须保持静态(如果没有,则会很烦人)。 单击LinkBut​​ton时,必须执行带参数的C#方法。

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

MyLinkButton.Click += (sender, e) => { MyClass.MyClick(par1, par2); };

但问题是,如果我添加以下属性以防止回发并在单击LinkBut​​ton时保持页面静态:

MyLinkButton.Attributes.Add("href", "javascript:;");

它不再在MyClass文件中运行MyClick方法。

所以我尝试从JS代码中调用MyClick方法,使用PageMethod对“Click”进行“No”更改。

在MyClass中,我添加了: System.Web.Services 的引用,并将 [WebMethod] 放在 public static void MyClick()上方方法。 还将一个ScriptManager添加到body / form中的MasterPage文件中,并设置属性 EnablePageMethods =“true”

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

PageMethods.MyClick(par1, par2)

PageMethods.MyClass.MyClick(par1, par2)

两者都没有触发该方法。我感谢任何意见或建议。

3 个答案:

答案 0 :(得分:3)

链接按钮的工作方式是,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的过度杀伤。这是微软试图在没有开发人员做多的情况下实施AJAX的尝试。就像ViewState一样,它有一个价格。如果价格可以承受,那取决于你。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果要在没有回发的情况下调用服务器,则必须使用Ajax或本机UpdatePanel功能。在您的情况下,我相信var https = require('https'); jsonObject = JSON.stringify({"arg1":"4","arg2":"True"}); // prepare the header var postheaders = { 'Content-Type' : 'application/json', 'Content-Length' : Buffer.byteLength(jsonObject, 'utf8') }; // the post options var optionspost = { host : 'https://www.example.com/', path : '/my/path/?arg1=4&arg2=True', method : 'POST', headers : postheaders }; var reqPost = https.request(optionspost, function(res) { console.log("statusCode: ", res.statusCode); res.on('data', function(d) { console.info('POST result:\n'); process.stdout.write(d); console.info('\n\nPOST completed'); }); }); reqPost.write(jsonObject); reqPost.end(); reqPost.on('error', function(e) { console.error(e); }); 是最好的。

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

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

https://msdn.microsoft.com/en-us/library/bb386454.aspx

http://www.4guysfromrolla.com/articles/102407-1.aspx

http://ajax.net-tutorials.com/controls/updatepanel-control/