12

我想在不使用更新面板进行回发的情况下重新创建更新面板回发。这样做的通用方法是什么?

例如,在 Stackoverflow 上,当您对某个问题投赞成票或反对票时,它会回发以更新数据库,我敢打赌他们没有使用更新面板。

我有什么?

我有一张带有表格数据的表格。当我单击td整个列的项目时,我想更新数据库并更新页面本身的网格视图。网格视图显示了表中所有当前单击的项目,因为它是通过“我们的方法”更新的。

寻找一种好的通用方法,我可以在没有更新面板的情况下用于许多异步回发。

4

2 回答 2

17

Stack Overflow 的工作方式与那篇 CodeProject 文章在两个重要方面不同。

  • Stack Overflow 正在针对 ASP.NET MVC 控制器操作而不是独立的 ASPX 页面发出 AJAX 请求。您可能会将其视为 ASP.NET AJAX 页面方法的 MVC 类似物。在这两种情况下,ASPX 方法在性能方面都会落后。

  • Stack Overflow 的 AJAX 请求返回 JSON 序列化结果,而不是任意纯文本或 HTML。这使得在客户端处理它更加标准化并且通常更清洁。

例如:当我投票赞成这个问题时,向 /questions/171000/vote 发出了一个 XmlHttpRequest 请求,POST 数据中的“voteTypeId”为 2。

处理请求的控制器将我的投票添加到某处的表中,然后用这个 JSON 响应:

{"Success":true,"NewScore":1,"Message":"","LastVoteTypeId":2}

使用该信息,此 JavaScript 负责更新客户端显示:

var voteResult = function(jClicked, postId, data) {
  if (data.Success) {
    jClicked.parent().find("span.vote-count-post").text(data.NewScore);
    if (data.Message)
      showFadingNotification(jClicked, data.Message);
  }
  else {
    showNotification(jClicked, data.Message);
    reset(jClicked, jClicked);

    if (data.LastVoteTypeId) {
      selectPreviousVote(jClicked, data.LastVoteTypeId);
    }
  }
};

如果您使用的是 WebForms,那么您在我的博客上找到的调用页面方法的示例绝对是正确的。

但是,我建议您考虑任何集中式功能的 Web 服务(例如这个投票示例),而不是页面方法。页面方法似乎更容易编写,但它们也有一些重用的缺点,并且往往会提供一种实际上并不存在的附加安全性的错觉。

这是一个执行与您发现的相同的事情的示例,但使用 Web 服务(此帖子的评论实际上导致了您找到的帖子):

http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

于 2008-10-05T03:13:37.717 回答
2

您可以使用标准的 AJAX 调用来完成此操作。创建一个 .aspx 页面,该页面在其 Page_Load 方法中更新数据库,并将任何所需信息(如更新后的当前 DB 值)显示为 XML。然后使用 jQuery 对该页面进行 AJAX 调用。

您还可以返回一个 HTML 片段(即更新的 GridView),并使用 jQuery 将更新的 HTML 插入当前页面。

编辑:此页面上的示例 2 应该非常接近您想要的:http:
//www.codeproject.com/KB/ajax/AjaxJQuerySample.aspx

于 2008-10-04T21:18:33.160 回答